@ozdao/martyrs 0.2.492 → 0.2.494

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/builder.cjs +53 -90
  6. package/dist/builder.js +54 -91
  7. package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
  8. package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
  9. package/dist/globals.server.cjs +322 -3
  10. package/dist/globals.server.js +303 -1
  11. package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
  12. package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
  13. package/dist/inventory.server.cjs +2 -2
  14. package/dist/inventory.server.js +2 -2
  15. package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
  16. package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
  17. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
  18. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
  20. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
  22. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  25. package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  31. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  33. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  34. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
  38. package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  47. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  55. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  56. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  59. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  60. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  62. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  70. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  72. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
  77. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
  79. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
  81. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
  82. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
  83. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
  84. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
  85. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
  86. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
  87. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  88. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
  91. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
  96. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
  98. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
  104. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
  106. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
  108. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
  110. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
  117. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
  118. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
  120. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
  122. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
  124. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
  126. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
  128. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
  129. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
  130. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
  131. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
  132. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
  134. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
  136. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
  138. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
  140. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
  142. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
  144. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
  146. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
  148. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  149. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
  150. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
  152. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
  154. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
  156. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
  158. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
  160. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
  161. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
  162. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  163. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
  164. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
  165. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
  166. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
  167. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
  168. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
  169. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
  170. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  171. package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
  172. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/music/music.client.js +9 -12
  174. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  175. package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
  176. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/music/router/music.js +27 -1
  178. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  179. package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
  180. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/music/store/artists.js +6 -4
  182. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
  183. package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
  184. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/music/store/player.js +5 -0
  186. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  187. package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
  188. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
  189. package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
  190. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  191. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
  192. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  193. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  195. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  197. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  198. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
  199. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  201. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
  202. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  203. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  204. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  205. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  206. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  207. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  208. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  209. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  210. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  211. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  213. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  214. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  215. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  216. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  217. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  218. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  219. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  220. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  221. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  222. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  223. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  224. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  225. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  226. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  228. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  234. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
  235. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
  236. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
  237. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
  238. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
  239. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
  240. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
  241. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
  242. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
  243. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
  244. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
  245. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
  246. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
  247. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
  248. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
  249. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
  250. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  251. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  252. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
  253. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  254. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  255. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  256. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  257. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  258. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  259. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  260. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  261. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  262. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  263. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  264. package/dist/martyrs.cjs.js +1 -1
  265. package/dist/martyrs.css +1 -1
  266. package/dist/martyrs.es.js +1 -1
  267. package/dist/music.server.cjs +124 -31
  268. package/dist/music.server.js +124 -31
  269. package/dist/organizations.server.cjs +1 -1
  270. package/dist/organizations.server.js +1 -1
  271. package/dist/products.server.cjs +2 -2
  272. package/dist/products.server.js +2 -2
  273. package/dist/rents.server.cjs +3 -3
  274. package/dist/rents.server.js +3 -3
  275. package/dist/style.css +373 -80
  276. package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
  277. package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
  278. package/package.json +1 -1
  279. package/src/builder/modes/ssr.prod.js +21 -5
  280. package/src/builder/rspack/rspack.config.spa.client.js +0 -44
  281. package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
  282. package/src/components/Calendar/Calendar.vue +378 -377
  283. package/src/components/Feed/Feed.vue +28 -2
  284. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  285. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  286. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  287. package/src/modules/music/README.md +8 -0
  288. package/src/modules/music/components/SidebarMusic.vue +6 -9
  289. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  290. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  291. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  292. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  293. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  294. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  295. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  296. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  297. package/src/modules/music/components/pages/Album.vue +373 -186
  298. package/src/modules/music/components/pages/Artist.vue +54 -94
  299. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  300. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  301. package/src/modules/music/components/pages/Playlist.vue +495 -379
  302. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  303. package/src/modules/music/components/pages/Track.vue +363 -69
  304. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  305. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  306. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  307. package/src/modules/music/controllers/search.controller.js +3 -0
  308. package/src/modules/music/controllers/stream.controller.js +11 -3
  309. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  310. package/src/modules/music/music.client.js +3 -6
  311. package/src/modules/music/music.server.js +8 -4
  312. package/src/modules/music/router/music.js +8 -1
  313. package/src/modules/music/routes/albums.routes.js +37 -5
  314. package/src/modules/music/routes/artists.routes.js +14 -4
  315. package/src/modules/music/routes/genres.routes.js +5 -1
  316. package/src/modules/music/routes/playlists.routes.js +42 -9
  317. package/src/modules/music/routes/tracks.routes.js +27 -2
  318. package/src/modules/music/store/artists.js +6 -2
  319. package/src/modules/music/store/player.js +6 -0
  320. package/src/modules/music/store/tracks.js +31 -0
  321. package/src/modules/music/websocket/streaming.handler.js +7 -1
  322. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  323. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  324. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  325. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  326. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  327. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  328. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  329. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  331. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  335. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  339. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  340. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  341. package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
@@ -2,139 +2,230 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
- const Feed = require("../../../../components/Feed/Feed.vue.cjs");
6
- const TrackCard = require("../cards/TrackCard.vue.cjs");
7
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
8
- const Loader = require("../../../../components/Loader/Loader.vue2.cjs");
6
+ ;/* empty css */
9
7
  const Media = require("../../../../components/Media/Media.vue.cjs");
10
8
  const Dropdown = require("../../../../components/Dropdown/Dropdown.vue.cjs");
9
+ const Feed = require("../../../../components/Feed/Feed.vue.cjs");
11
10
  const Popup = require("../../../../components/Popup/Popup.vue.cjs");
12
- const Field = require("../../../../components/Field/Field.vue2.cjs");
13
- const Radio = require("../../../../components/Radio/Radio.vue.cjs");
14
- const UploadImage = require("../../../../components/UploadImage/UploadImage.vue.cjs");
15
11
  const IconPlay = require("../../../icons/navigation/IconPlay.vue.cjs");
16
- const IconLike = require("../../../icons/navigation/IconLike.vue.cjs");
17
12
  const IconEllipsis = require("../../../icons/navigation/IconEllipsis.vue.cjs");
18
- const IconMusic = require("../../../icons/entities/IconMusic.vue.cjs");
19
- const auth = require("../../../auth/views/store/auth.cjs");
13
+ const IconShuffle = require("../../../icons/navigation/IconShuffle.vue.cjs");
14
+ const IconCalendar = ;/* empty css */
15
+ const IconTime = require("../../../icons/entities/IconTime.vue.cjs");
16
+ const IconShow = require("../../../icons/actions/IconShow.vue.cjs");
17
+ const IconRefresh = require("../../../icons/navigation/IconRefresh.vue.cjs");
18
+ const IconCheckmark = require("../../../icons/navigation/IconCheckmark.vue.cjs");
19
+ const TrackListCard = require("../cards/TrackListCard.vue.cjs");
20
+ const PlaylistCard = require("../cards/PlaylistCard.vue.cjs");
21
+ const PlaylistForm = require("../forms/PlaylistForm.vue.cjs");
20
22
  const playlists = require("../../store/playlists.cjs");
23
+ require("../../store/tracks.cjs");
21
24
  const player = require("../../store/player.cjs");
22
- const _hoisted_1 = { class: "playlist-page" };
25
+ const auth = require("../../../auth/views/store/auth.cjs");
26
+ const globals = require("../../../globals/views/store/globals.cjs");
27
+ const _hoisted_1 = { class: "playlist-page pd-small" };
23
28
  const _hoisted_2 = {
24
29
  key: 0,
25
- class: "w-100 h-25r flex-center flex"
30
+ class: "t-center pd-big"
26
31
  };
27
32
  const _hoisted_3 = {
28
33
  key: 1,
29
- class: "t-center pd-big"
34
+ class: "playlist-content cols-2-fit-content mobile:cols-1 gap-big"
30
35
  };
31
- const _hoisted_4 = { key: 2 };
32
- const _hoisted_5 = { class: "playlist-header mn-b-medium flex flex-v-center gap-medium" };
33
- const _hoisted_6 = { class: "playlist-cover" };
34
- const _hoisted_7 = { class: "playlist-info" };
35
- const _hoisted_8 = { class: "" };
36
- const _hoisted_9 = {
36
+ const _hoisted_4 = { class: "pos-sticky pos-t-0 mobile:pos-relative playlist-cover-section" };
37
+ const _hoisted_5 = { class: "cover-container relative mn-b-medium radius-big overflow-hidden shadow-big" };
38
+ const _hoisted_6 = { class: "stats-grid grid cols-2 gap-small" };
39
+ const _hoisted_7 = { class: "stat-card bg-light pd-medium radius-medium t-center" };
40
+ const _hoisted_8 = { class: "mn-b-thin" };
41
+ const _hoisted_9 = { class: "stat-card bg-light pd-medium radius-medium t-center" };
42
+ const _hoisted_10 = { class: "mn-b-thin" };
43
+ const _hoisted_11 = { class: "playlist-details-section" };
44
+ const _hoisted_12 = { class: "flex items-center gap-small mn-b-small" };
45
+ const _hoisted_13 = {
37
46
  key: 0,
38
- class: "playlist-description t-grey mn-t-thin mn-b-small"
47
+ class: "badge bg-secondary-transp-20 t-secondary pd-thin-big radius-small t-small"
39
48
  };
40
- const _hoisted_10 = { class: "playlist-meta flex flex-v-center" };
41
- const _hoisted_11 = {
49
+ const _hoisted_14 = {
42
50
  key: 1,
43
- class: "t-medium"
51
+ class: "badge bg-success-transp-20 t-success pd-thin-big radius-small t-small"
44
52
  };
45
- const _hoisted_12 = { class: "t-grey" };
46
- const _hoisted_13 = { class: "playlist-actions mn-b-medium flex flex-v-center gap-small" };
47
- const _hoisted_14 = {
48
- key: 0,
49
- class: "pd-small bg-dark radius-small pos-absolute pos-t-100 pos-r-0 z-index-3 w-max-15r mn-t-thin"
53
+ const _hoisted_15 = { class: "h1 mn-b-medium" };
54
+ const _hoisted_16 = { class: "flex gap-small mn-b-medium" };
55
+ const _hoisted_17 = { class: "dropdown-menu bg-dark pd-small radius-medium shadow-big mn-t-thin" };
56
+ const _hoisted_18 = { class: "owner-section mn-b-big" };
57
+ const _hoisted_19 = { class: "owner-card bg-light pd-medium radius-medium flex items-center gap-medium" };
58
+ const _hoisted_20 = { class: "owner-avatar" };
59
+ const _hoisted_21 = {
60
+ key: 1,
61
+ class: "w-4r h-4r radius-full bg-primary flex-center"
50
62
  };
51
- const _hoisted_15 = {
63
+ const _hoisted_22 = { class: "flex items-center gap-thin" };
64
+ const _hoisted_23 = { class: "t-large" };
65
+ const _hoisted_24 = { class: "t-small t-transp" };
66
+ const _hoisted_25 = {
52
67
  key: 0,
53
- class: "mn-b-thin"
68
+ class: "collaborators-section mn-b-big"
54
69
  };
55
- const _hoisted_16 = { class: "mn-b-thin" };
56
- const _hoisted_17 = {
70
+ const _hoisted_26 = { class: "flex flex-wrap gap-small" };
71
+ const _hoisted_27 = { class: "t-small" };
72
+ const _hoisted_28 = { class: "metadata-grid grid cols-2 gap-small mn-b-big" };
73
+ const _hoisted_29 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
74
+ const _hoisted_30 = { class: "t-medium" };
75
+ const _hoisted_31 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
76
+ const _hoisted_32 = { class: "t-medium" };
77
+ const _hoisted_33 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
78
+ const _hoisted_34 = { class: "t-medium" };
79
+ const _hoisted_35 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
80
+ const _hoisted_36 = { class: "t-medium" };
81
+ const _hoisted_37 = {
57
82
  key: 1,
58
- class: "mn-b-thin"
83
+ class: "tags-section mn-b-medium"
59
84
  };
60
- const _hoisted_18 = {
85
+ const _hoisted_38 = { class: "flex gap-thin flex-wrap" };
86
+ const _hoisted_39 = {
61
87
  key: 2,
62
- class: "mn-b-thin"
88
+ class: "description-section bg-light pd-medium radius-medium mn-b-medium"
63
89
  };
64
- const _hoisted_19 = { class: "playlist-tracks" };
65
- const _hoisted_20 = {
66
- key: 0,
67
- class: "empty-tracks t-center pd-big bg-dark-transp-10 radius-medium"
90
+ const _hoisted_40 = { class: "t-transp" };
91
+ const _hoisted_41 = {
92
+ key: 2,
93
+ class: "tracks-section mn-t-big"
68
94
  };
69
- const _hoisted_21 = { class: "form-group mn-b-medium" };
70
- const _hoisted_22 = { class: "form-group mn-b-medium" };
71
- const _hoisted_23 = { class: "form-group mn-b-medium" };
72
- const _hoisted_24 = { class: "flex gap-small" };
73
- const _hoisted_25 = { class: "form-group mn-b-medium" };
74
- const _hoisted_26 = { class: "playlist-cover-upload flex gap-medium" };
75
- const _hoisted_27 = { class: "playlist-cover-preview bg-dark-transp-25 radius-small o-hidden" };
76
- const _hoisted_28 = {
77
- key: 1,
78
- class: "w-10r h-10r flex-center flex"
95
+ const _hoisted_42 = { class: "bg-light radius-medium o-hidden" };
96
+ const _hoisted_43 = {
97
+ key: 3,
98
+ class: "empty-section mn-t-big"
99
+ };
100
+ const _hoisted_44 = { class: "empty-tracks t-center pd-big bg-light radius-medium" };
101
+ const _hoisted_45 = {
102
+ key: 4,
103
+ class: "more-playlists-section mn-t-big"
79
104
  };
80
- const _hoisted_29 = { class: "form-actions t-right" };
81
- const _hoisted_30 = { class: "t-right" };
105
+ const _hoisted_46 = { class: "flex justify-between items-center mn-b-medium" };
106
+ const _hoisted_47 = { class: "flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide" };
107
+ const _hoisted_48 = { class: "t-transp mn-b-medium" };
108
+ const _hoisted_49 = { class: "flex justify-end gap-small" };
82
109
  const _sfc_main = {
83
110
  __name: "Playlist",
84
- setup(__props) {
111
+ emits: ["page-loading", "page-loaded"],
112
+ setup(__props, { emit: __emit }) {
85
113
  const route = vueRouter.useRoute();
86
114
  const router = vueRouter.useRouter();
87
- const isLoading = vue.ref(true);
88
- const isFavorite = vue.ref(false);
115
+ const emits = __emit;
116
+ const hasLoaded = vue.ref(false);
117
+ const isFollowing = vue.ref(false);
89
118
  const showDropdown = vue.ref(false);
90
119
  const showEditModal = vue.ref(false);
91
120
  const showDeleteModal = vue.ref(false);
92
- const validationErrors = vue.reactive({});
93
- const editForm = vue.reactive({
94
- title: "",
95
- description: "",
96
- isPublic: true,
97
- coverUrl: ""
98
- });
121
+ const followedUsers = vue.ref([]);
122
+ const morePlaylists = vue.ref([]);
123
+ playlists.state.currentPlaylist = null;
124
+ playlists.state.currentPlaylistTracks = [];
99
125
  const playlist = vue.computed(() => playlists.state.currentPlaylist);
100
- const playlistTracks = vue.computed(() => playlists.state.currentPlaylistTracks);
126
+ const playlistTracks = vue.computed(() => playlists.state.currentPlaylistTracks || []);
101
127
  const isOwner = vue.computed(() => {
102
128
  if (!playlist.value || !auth.state.user) return false;
103
- return playlist.value.owner?.target?._id === auth.state.user._id || playlist.value.owner?.target === auth.state.user._id;
129
+ const ownerId = playlist.value.owner?.target?._id || playlist.value.owner?.target;
130
+ return ownerId === auth.state.user._id;
104
131
  });
105
132
  const isCollaborator = vue.computed(() => {
106
133
  if (!playlist.value || !auth.state.user) return false;
107
134
  return playlist.value.collaborators?.some(
108
- (collab) => collab._id === auth.state.user._id || collab === auth.state.user._id
135
+ (collab) => (collab._id || collab) === auth.state.user._id
109
136
  );
110
137
  });
138
+ const totalDuration = vue.computed(() => {
139
+ if (!playlistTracks.value.length) return "0:00";
140
+ const totalSeconds = playlistTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);
141
+ return formatDuration(totalSeconds);
142
+ });
143
+ const getOwnerData = (playlist2) => {
144
+ if (!playlist2) return null;
145
+ const owner = playlist2.creator?.target || playlist2.owner?.target;
146
+ return typeof owner === "object" ? owner : null;
147
+ };
148
+ const getOwnerId = (playlist2) => {
149
+ if (!playlist2) return null;
150
+ const owner = playlist2.creator?.target || playlist2.owner?.target;
151
+ return typeof owner === "object" ? owner._id : owner;
152
+ };
111
153
  const getPlaylistOwnerName = (playlist2) => {
112
- if (!playlist2 || !playlist2.owner) return "Unknown";
113
- const owner = playlist2.owner.target;
114
- if (typeof owner === "object") {
115
- if (owner.profile?.name) {
116
- return owner.profile.name;
117
- }
118
- return owner.name || "Unknown";
154
+ if (!playlist2) return "Unknown";
155
+ const owner = getOwnerData(playlist2);
156
+ if (owner) {
157
+ return owner.profile?.name || owner.name || "Unknown";
119
158
  }
120
159
  return "Unknown";
121
160
  };
122
161
  const getOwnerProfileLink = (owner) => {
123
162
  if (!owner || !owner.target) return { name: "music-home" };
124
- if (owner.type === "User") {
125
- return { name: "user-profile", params: { _id: owner.target._id || owner.target } };
126
- } else if (owner.type === "Organization") {
127
- return { name: "organization-profile", params: { _id: owner.target._id || owner.target } };
163
+ const targetId = typeof owner.target === "object" ? owner.target._id : owner.target;
164
+ if (owner.type === "user" || owner.type === "User") {
165
+ return { name: "User Profile", params: { _id: targetId } };
166
+ } else if (owner.type === "organization" || owner.type === "Organization") {
167
+ return { name: "Organizatio", params: { _id: targetId } };
128
168
  }
129
169
  return { name: "music-home" };
130
170
  };
171
+ const formatDate = (dateString) => {
172
+ if (!dateString) return "Unknown";
173
+ return new Date(dateString).toLocaleDateString("en-US", {
174
+ year: "numeric",
175
+ month: "long",
176
+ day: "numeric"
177
+ });
178
+ };
179
+ const formatDuration = (seconds) => {
180
+ if (!seconds) return "0:00";
181
+ const h = Math.floor(seconds / 3600);
182
+ const m = Math.floor(seconds % 3600 / 60);
183
+ const s = Math.floor(seconds % 60);
184
+ if (h > 0) {
185
+ return `${h}:${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
186
+ }
187
+ return `${m}:${s.toString().padStart(2, "0")}`;
188
+ };
189
+ const formatNumber = (num) => {
190
+ if (!num) return "0";
191
+ if (num >= 1e6) {
192
+ return (num / 1e6).toFixed(1) + "M";
193
+ } else if (num >= 1e3) {
194
+ return (num / 1e3).toFixed(1) + "K";
195
+ }
196
+ return num.toString();
197
+ };
131
198
  const playPlaylist = () => {
132
199
  if (playlistTracks.value && playlistTracks.value.length > 0) {
133
200
  player.actions.setQueue(playlistTracks.value);
134
201
  }
135
202
  };
136
- const toggleFavorite = () => {
137
- isFavorite.value = !isFavorite.value;
203
+ const shufflePlay = () => {
204
+ if (playlistTracks.value && playlistTracks.value.length > 0) {
205
+ const shuffled = [...playlistTracks.value].sort(() => Math.random() - 0.5);
206
+ player.actions.setQueue(shuffled);
207
+ }
208
+ };
209
+ const toggleFollow = async () => {
210
+ isFollowing.value = !isFollowing.value;
211
+ try {
212
+ if (isFollowing.value) {
213
+ await playlists.actions.followPlaylist(playlist.value._id);
214
+ } else {
215
+ await playlists.actions.unfollowPlaylist(playlist.value._id);
216
+ }
217
+ } catch (error) {
218
+ console.error("Error toggling follow:", error);
219
+ isFollowing.value = !isFollowing.value;
220
+ }
221
+ };
222
+ const toggleFollowUser = (userId) => {
223
+ const index = followedUsers.value.indexOf(userId);
224
+ if (index > -1) {
225
+ followedUsers.value.splice(index, 1);
226
+ } else {
227
+ followedUsers.value.push(userId);
228
+ }
138
229
  };
139
230
  const addToQueue = () => {
140
231
  if (playlistTracks.value && playlistTracks.value.length > 0) {
@@ -145,32 +236,9 @@ const _sfc_main = {
145
236
  }
146
237
  };
147
238
  const editPlaylist = () => {
148
- editForm.title = playlist.value.title;
149
- editForm.description = playlist.value.description || "";
150
- editForm.isPublic = playlist.value.isPublic;
151
- editForm.coverUrl = playlist.value.coverUrl || "";
152
239
  showEditModal.value = true;
153
240
  showDropdown.value = false;
154
241
  };
155
- const updatePlaylist = async () => {
156
- validationErrors.title = !editForm.title ? { message: "Playlist name is required" } : null;
157
- if (Object.values(validationErrors).some((error) => error !== null)) {
158
- return;
159
- }
160
- try {
161
- const updatedData = {
162
- _id: playlist.value._id,
163
- title: editForm.title,
164
- description: editForm.description,
165
- isPublic: editForm.isPublic,
166
- coverUrl: editForm.coverUrl
167
- };
168
- await playlists.actions.updatePlaylist(updatedData);
169
- showEditModal.value = false;
170
- } catch (error) {
171
- console.error("Error updating playlist:", error);
172
- }
173
- };
174
242
  const toggleCollaborative = async () => {
175
243
  try {
176
244
  const updatedData = {
@@ -193,382 +261,443 @@ const _sfc_main = {
193
261
  router.push({ name: "music-library" });
194
262
  } catch (error) {
195
263
  console.error("Error deleting playlist:", error);
264
+ globals.actions.setError({
265
+ message: "Failed to delete playlist"
266
+ });
267
+ }
268
+ };
269
+ const removeTrack = async (trackId) => {
270
+ try {
271
+ await playlists.actions.removeTrackFromPlaylist(playlist.value._id, trackId);
272
+ await fetchPlaylistData();
273
+ } catch (error) {
274
+ console.error("Error removing track:", error);
275
+ globals.actions.setError({
276
+ message: "Failed to remove track"
277
+ });
196
278
  }
197
279
  };
198
280
  const copyLink = () => {
199
- const url = window.location.href;
200
- navigator.clipboard.writeText(url).then(() => {
201
- showDropdown.value = false;
202
- });
281
+ navigator.clipboard.writeText(window.location.href);
282
+ showDropdown.value = false;
283
+ };
284
+ const handlePlaylistUpdated = () => {
285
+ showEditModal.value = false;
286
+ fetchPlaylistData();
203
287
  };
204
288
  const fetchPlaylistData = async () => {
205
- isLoading.value = true;
206
289
  try {
207
290
  await playlists.actions.fetchPlaylistByUrl(route.params.url);
291
+ if (auth.state.user && playlist.value) {
292
+ }
293
+ if (playlist.value?.creator?.target) {
294
+ const creatorId = typeof playlist.value.creator.target === "object" ? playlist.value.creator.target._id : playlist.value.creator.target;
295
+ const playlists$1 = await playlists.actions.fetchPlaylists({
296
+ "creator.target": creatorId,
297
+ isPublic: true,
298
+ limit: 6
299
+ });
300
+ morePlaylists.value = playlists$1.filter((p) => p._id !== playlist.value._id).slice(0, 5);
301
+ }
208
302
  } catch (error) {
209
303
  console.error("Error fetching playlist data:", error);
210
- } finally {
211
- isLoading.value = false;
212
304
  }
213
305
  };
214
- vue.onMounted(fetchPlaylistData);
215
- vue.watch(() => route.params.url, (newUrl) => {
216
- if (newUrl) {
217
- fetchPlaylistData();
218
- }
306
+ vue.onMounted(async () => {
307
+ emits("page-loading");
308
+ await fetchPlaylistData();
309
+ hasLoaded.value = true;
310
+ emits("page-loaded");
219
311
  });
220
312
  return (_ctx, _cache) => {
221
313
  const _component_router_link = vue.resolveComponent("router-link");
222
314
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
223
- isLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
224
- vue.createVNode(Loader.default)
225
- ])) : !playlist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, _cache[11] || (_cache[11] = [
315
+ hasLoaded.value && !playlist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, _cache[7] || (_cache[7] = [
226
316
  vue.createElementVNode("h2", { class: "" }, "Playlist not found", -1),
227
- vue.createElementVNode("p", { class: "t-grey t-medium" }, "The playlist you're looking for doesn't exist or has been removed.", -1)
228
- ]))) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
229
- vue.createElementVNode("div", _hoisted_5, [
230
- vue.createElementVNode("div", _hoisted_6, [
317
+ vue.createElementVNode("p", { class: "t-transp t-medium" }, "The playlist you're looking for doesn't exist or has been removed.", -1)
318
+ ]))) : vue.createCommentVNode("", true),
319
+ playlist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
320
+ vue.createElementVNode("div", _hoisted_4, [
321
+ vue.createElementVNode("div", _hoisted_5, [
231
322
  vue.createVNode(Media.default, {
232
323
  url: playlist.value.coverUrl || "/assets/placeholder-playlist.jpg",
233
- class: "w-15r h-15r object-fit-cover shadow-lg radius-small"
234
- }, null, 8, ["url"])
324
+ alt: playlist.value.title,
325
+ class: "aspect-1x1 w-100 radius-medium o-hidden"
326
+ }, null, 8, ["url", "alt"])
235
327
  ]),
236
- vue.createElementVNode("div", _hoisted_7, [
237
- _cache[13] || (_cache[13] = vue.createElementVNode("div", { class: "t-small t-uppercase" }, "Playlist", -1)),
238
- vue.createElementVNode("h1", _hoisted_8, vue.toDisplayString(playlist.value.title), 1),
239
- playlist.value.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_9, vue.toDisplayString(playlist.value.description), 1)) : vue.createCommentVNode("", true),
240
- vue.createElementVNode("div", _hoisted_10, [
241
- playlist.value.owner && playlist.value.owner.target ? (vue.openBlock(), vue.createBlock(_component_router_link, {
242
- key: 0,
243
- to: getOwnerProfileLink(playlist.value.owner),
244
- class: "t-medium hover-t-main"
245
- }, {
246
- default: vue.withCtx(() => [
247
- vue.createTextVNode(vue.toDisplayString(getPlaylistOwnerName(playlist.value)), 1)
248
- ]),
249
- _: 1
250
- }, 8, ["to"])) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_11, vue.toDisplayString(getPlaylistOwnerName(playlist.value)), 1)),
251
- _cache[12] || (_cache[12] = vue.createElementVNode("span", { class: "t-grey mn-l-small mn-r-small" }, "•", -1)),
252
- vue.createElementVNode("span", _hoisted_12, vue.toDisplayString(playlistTracks.value.length) + " " + vue.toDisplayString(playlistTracks.value.length === 1 ? "song" : "songs"), 1)
328
+ vue.createElementVNode("div", _hoisted_6, [
329
+ vue.createElementVNode("div", _hoisted_7, [
330
+ vue.createElementVNode("div", _hoisted_8, vue.toDisplayString(playlistTracks.value.length), 1),
331
+ _cache[8] || (_cache[8] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Tracks", -1))
332
+ ]),
333
+ vue.createElementVNode("div", _hoisted_9, [
334
+ vue.createElementVNode("div", _hoisted_10, vue.toDisplayString(formatNumber(playlist.value.followers || 0)), 1),
335
+ _cache[9] || (_cache[9] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Followers", -1))
253
336
  ])
254
337
  ])
255
338
  ]),
256
- vue.createElementVNode("div", _hoisted_13, [
257
- vue.createVNode(Button.default, {
258
- onClick: playPlaylist,
259
- class: "play-button bg-main radius-round pd-small flex-v-center flex gap-small hover-scale-1",
260
- showLoader: false,
261
- showSucces: false
262
- }, {
263
- default: vue.withCtx(() => [
264
- vue.createVNode(IconPlay.default, {
265
- class: "i-small",
266
- fill: "rgb(var(--black))"
267
- }),
268
- _cache[14] || (_cache[14] = vue.createElementVNode("span", { class: "t-black t-medium" }, "Play", -1))
269
- ]),
270
- _: 1
271
- }),
272
- vue.createVNode(Button.default, {
273
- onClick: toggleFavorite,
274
- class: "bg-transparent border-none pd-zero",
275
- showLoader: false,
276
- showSucces: false
277
- }, {
278
- default: vue.withCtx(() => [
279
- vue.createVNode(IconLike.default, {
280
- class: "i-medium",
281
- fill: isFavorite.value ? "rgb(var(--main))" : "rgb(var(--white))"
282
- }, null, 8, ["fill"])
283
- ]),
284
- _: 1
285
- }),
286
- vue.createVNode(Dropdown.default, { class: "pos-relative" }, {
287
- content: vue.withCtx(() => [
288
- showDropdown.value ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_14, [
289
- isOwner.value ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_15, [
290
- vue.createVNode(Button.default, {
291
- onClick: editPlaylist,
292
- class: "bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small",
293
- showLoader: false,
294
- showSucces: false
295
- }, {
296
- default: vue.withCtx(() => _cache[15] || (_cache[15] = [
297
- vue.createElementVNode("span", null, "Edit Details", -1)
298
- ])),
299
- _: 1
300
- })
301
- ])) : vue.createCommentVNode("", true),
302
- vue.createElementVNode("li", _hoisted_16, [
339
+ vue.createElementVNode("div", _hoisted_11, [
340
+ vue.createElementVNode("div", _hoisted_12, [
341
+ _cache[10] || (_cache[10] = vue.createElementVNode("span", { class: "badge bg-primary-transp-20 t-primary pd-thin-big radius-small t-small t-uppercase" }, " Playlist ", -1)),
342
+ playlist.value.isCollaborative ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_13, " Collaborative ")) : vue.createCommentVNode("", true),
343
+ playlist.value.status === "published" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_14, " Published ")) : vue.createCommentVNode("", true)
344
+ ]),
345
+ vue.createElementVNode("h1", _hoisted_15, vue.toDisplayString(playlist.value.title), 1),
346
+ vue.createElementVNode("div", _hoisted_16, [
347
+ vue.createVNode(Button.default, {
348
+ onClick: playPlaylist,
349
+ color: "primary",
350
+ size: "medium",
351
+ class: "flex-1 flex-center gap-thin"
352
+ }, {
353
+ default: vue.withCtx(() => [
354
+ vue.createVNode(IconPlay.default, { class: "i-medium" }),
355
+ _cache[11] || (_cache[11] = vue.createTextVNode(" Play All "))
356
+ ]),
357
+ _: 1
358
+ }),
359
+ vue.createVNode(Button.default, {
360
+ onClick: shufflePlay,
361
+ color: "primary",
362
+ size: "medium",
363
+ class: "flex-1 flex-center gap-thin"
364
+ }, {
365
+ default: vue.withCtx(() => [
366
+ vue.createVNode(IconShuffle.default, { class: "i-medium" }),
367
+ _cache[12] || (_cache[12] = vue.createTextVNode(" Shuffle "))
368
+ ]),
369
+ _: 1
370
+ }),
371
+ vue.createVNode(Button.default, {
372
+ onClick: toggleFollow,
373
+ color: "primary",
374
+ size: "medium",
375
+ class: "flex-1 flex-center gap-thin"
376
+ }, {
377
+ default: vue.withCtx(() => [
378
+ vue.createTextVNode(vue.toDisplayString(isFollowing.value ? "Follow" : "Unfollow"), 1)
379
+ ]),
380
+ _: 1
381
+ }),
382
+ vue.createVNode(Dropdown.default, {
383
+ label: { component: IconEllipsis.default, class: "i-medium" },
384
+ modelValue: showDropdown.value,
385
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => showDropdown.value = $event),
386
+ class: "relative"
387
+ }, {
388
+ trigger: vue.withCtx(() => [
389
+ vue.createVNode(Button.default, {
390
+ color: "transp",
391
+ size: "medium",
392
+ class: "w-3r h-3r radius-full"
393
+ }, {
394
+ default: vue.withCtx(() => [
395
+ vue.createVNode(IconEllipsis.default, { class: "w-1-25r h-1-25r" })
396
+ ]),
397
+ _: 1
398
+ })
399
+ ]),
400
+ default: vue.withCtx(() => [
401
+ vue.createElementVNode("div", _hoisted_17, [
303
402
  vue.createVNode(Button.default, {
304
403
  onClick: addToQueue,
305
- class: "bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small",
306
- showLoader: false,
307
- showSucces: false
308
- }, {
309
- default: vue.withCtx(() => _cache[16] || (_cache[16] = [
310
- vue.createElementVNode("span", null, "Add to Queue", -1)
311
- ])),
312
- _: 1
313
- })
314
- ]),
315
- isOwner.value ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_17, [
316
- vue.createVNode(Button.default, {
317
- onClick: toggleCollaborative,
318
- class: "bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small",
319
- showLoader: false,
320
- showSucces: false
321
- }, {
322
- default: vue.withCtx(() => [
323
- vue.createElementVNode("span", null, vue.toDisplayString(playlist.value.isCollaborative ? "Make Private" : "Make Collaborative"), 1)
324
- ]),
325
- _: 1
326
- })
327
- ])) : vue.createCommentVNode("", true),
328
- isOwner.value ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_18, [
329
- vue.createVNode(Button.default, {
330
- onClick: deletePlaylist,
331
- class: "bg-transparent border-none pd-thin t-fourth w-100 t-left hover-bg-dark radius-small",
332
- showLoader: false,
333
- showSucces: false
404
+ color: "transp",
405
+ size: "small",
406
+ class: "w-100 justify-start"
334
407
  }, {
335
- default: vue.withCtx(() => _cache[17] || (_cache[17] = [
336
- vue.createElementVNode("span", null, "Delete", -1)
408
+ default: vue.withCtx(() => _cache[13] || (_cache[13] = [
409
+ vue.createTextVNode(" Add to Queue ")
337
410
  ])),
338
411
  _: 1
339
- })
340
- ])) : vue.createCommentVNode("", true),
341
- vue.createElementVNode("li", null, [
412
+ }),
342
413
  vue.createVNode(Button.default, {
343
414
  onClick: copyLink,
344
- class: "bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small",
345
- showLoader: false,
346
- showSucces: false
415
+ color: "transp",
416
+ size: "small",
417
+ class: "w-100 justify-start"
347
418
  }, {
348
- default: vue.withCtx(() => _cache[18] || (_cache[18] = [
349
- vue.createElementVNode("span", null, "Copy Link", -1)
419
+ default: vue.withCtx(() => _cache[14] || (_cache[14] = [
420
+ vue.createTextVNode(" Copy Link ")
350
421
  ])),
351
422
  _: 1
352
- })
423
+ }),
424
+ isOwner.value || isCollaborator.value ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
425
+ _cache[17] || (_cache[17] = vue.createElementVNode("hr", { class: "mn-v-thin border-dark-transp-10" }, null, -1)),
426
+ vue.createVNode(Button.default, {
427
+ onClick: editPlaylist,
428
+ color: "transp",
429
+ size: "small",
430
+ class: "w-100 justify-start"
431
+ }, {
432
+ default: vue.withCtx(() => _cache[15] || (_cache[15] = [
433
+ vue.createTextVNode(" Edit Playlist ")
434
+ ])),
435
+ _: 1
436
+ }),
437
+ isOwner.value ? (vue.openBlock(), vue.createBlock(Button.default, {
438
+ key: 0,
439
+ onClick: toggleCollaborative,
440
+ color: "transp",
441
+ size: "small",
442
+ class: "w-100 justify-start"
443
+ }, {
444
+ default: vue.withCtx(() => [
445
+ vue.createTextVNode(vue.toDisplayString(playlist.value.isCollaborative ? "Make Private" : "Make Collaborative"), 1)
446
+ ]),
447
+ _: 1
448
+ })) : vue.createCommentVNode("", true),
449
+ isOwner.value ? (vue.openBlock(), vue.createBlock(Button.default, {
450
+ key: 1,
451
+ onClick: deletePlaylist,
452
+ color: "danger",
453
+ size: "small",
454
+ class: "w-100 justify-start"
455
+ }, {
456
+ default: vue.withCtx(() => _cache[16] || (_cache[16] = [
457
+ vue.createTextVNode(" Delete Playlist ")
458
+ ])),
459
+ _: 1
460
+ })) : vue.createCommentVNode("", true)
461
+ ], 64)) : vue.createCommentVNode("", true)
353
462
  ])
354
- ])) : vue.createCommentVNode("", true)
355
- ]),
356
- default: vue.withCtx(() => [
357
- vue.createVNode(Button.default, {
358
- onClick: _cache[0] || (_cache[0] = ($event) => showDropdown.value = !showDropdown.value),
359
- class: "bg-transparent border-none pd-zero",
360
- showLoader: false,
361
- showSucces: false
463
+ ]),
464
+ _: 1
465
+ }, 8, ["label", "modelValue"])
466
+ ]),
467
+ vue.createElementVNode("div", _hoisted_18, [
468
+ _cache[18] || (_cache[18] = vue.createElementVNode("h3", { class: "t-medium mn-b-small" }, "Created by", -1)),
469
+ vue.createElementVNode("div", _hoisted_19, [
470
+ vue.createVNode(_component_router_link, {
471
+ to: getOwnerProfileLink(playlist.value.creator || playlist.value.owner),
472
+ class: "flex items-center gap-medium flex-1 hover-opacity"
473
+ }, {
474
+ default: vue.withCtx(() => [
475
+ vue.createElementVNode("div", _hoisted_20, [
476
+ getOwnerData(playlist.value)?.photoUrl ? (vue.openBlock(), vue.createBlock(Media.default, {
477
+ key: 0,
478
+ url: getOwnerData(playlist.value).photoUrl,
479
+ alt: getOwnerData(playlist.value)?.name,
480
+ class: "w-4r h-4r radius-full object-cover"
481
+ }, null, 8, ["url", "alt"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_21, vue.toDisplayString(getPlaylistOwnerName(playlist.value).charAt(0)), 1))
482
+ ]),
483
+ vue.createElementVNode("div", null, [
484
+ vue.createElementVNode("div", _hoisted_22, [
485
+ vue.createElementVNode("span", _hoisted_23, vue.toDisplayString(getPlaylistOwnerName(playlist.value)), 1),
486
+ getOwnerData(playlist.value)?.isVerified ? (vue.openBlock(), vue.createBlock(IconCheckmark.default, {
487
+ key: 0,
488
+ class: "w-1r h-1r t-primary"
489
+ })) : vue.createCommentVNode("", true)
490
+ ]),
491
+ vue.createElementVNode("span", _hoisted_24, vue.toDisplayString(playlist.value.creator?.type || "User"), 1)
492
+ ])
493
+ ]),
494
+ _: 1
495
+ }, 8, ["to"]),
496
+ !isOwner.value && vue.unref(auth.state).user ? (vue.openBlock(), vue.createBlock(Button.default, {
497
+ key: 0,
498
+ onClick: _cache[1] || (_cache[1] = () => toggleFollowUser(getOwnerId(playlist.value))),
499
+ color: followedUsers.value.includes(getOwnerId(playlist.value)) ? "primary" : "transp",
500
+ size: "small"
362
501
  }, {
363
502
  default: vue.withCtx(() => [
364
- vue.createVNode(IconEllipsis.default, {
365
- class: "i-medium",
366
- fill: "rgb(var(--white))"
367
- })
503
+ vue.createTextVNode(vue.toDisplayString(followedUsers.value.includes(getOwnerId(playlist.value)) ? "Following" : "Follow"), 1)
368
504
  ]),
369
505
  _: 1
370
- })
506
+ }, 8, ["color"])) : vue.createCommentVNode("", true)
507
+ ])
508
+ ]),
509
+ playlist.value.collaborators && playlist.value.collaborators.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_25, [
510
+ _cache[19] || (_cache[19] = vue.createElementVNode("h3", { class: "t-medium mn-b-small" }, "Collaborators", -1)),
511
+ vue.createElementVNode("div", _hoisted_26, [
512
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(playlist.value.collaborators, (collaborator) => {
513
+ return vue.openBlock(), vue.createElementBlock("div", {
514
+ key: collaborator._id || collaborator,
515
+ class: "collaborator-chip bg-light pd-thin-big radius-full flex items-center gap-thin"
516
+ }, [
517
+ collaborator.photoUrl ? (vue.openBlock(), vue.createBlock(Media.default, {
518
+ key: 0,
519
+ url: collaborator.photoUrl,
520
+ class: "w-1-5r h-1-5r radius-full object-cover"
521
+ }, null, 8, ["url"])) : vue.createCommentVNode("", true),
522
+ vue.createElementVNode("span", _hoisted_27, vue.toDisplayString(collaborator.name || collaborator.profile?.name || "User"), 1)
523
+ ]);
524
+ }), 128))
525
+ ])
526
+ ])) : vue.createCommentVNode("", true),
527
+ vue.createElementVNode("div", _hoisted_28, [
528
+ vue.createElementVNode("div", _hoisted_29, [
529
+ vue.createVNode(IconCalendar.default, { class: "i-medium t-primary" }),
530
+ vue.createElementVNode("div", null, [
531
+ _cache[20] || (_cache[20] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Created", -1)),
532
+ vue.createElementVNode("div", _hoisted_30, vue.toDisplayString(formatDate(playlist.value.createdAt)), 1)
533
+ ])
371
534
  ]),
372
- _: 1
373
- })
374
- ]),
375
- vue.createElementVNode("div", _hoisted_19, [
376
- playlistTracks.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_20, [
377
- _cache[20] || (_cache[20] = vue.createElementVNode("h3", { class: "mn-b-small" }, "This playlist is empty", -1)),
378
- _cache[21] || (_cache[21] = vue.createElementVNode("p", { class: "t-grey t-medium" }, "Add some tracks to get started", -1)),
379
- isOwner.value || isCollaborator.value ? (vue.openBlock(), vue.createBlock(Button.default, {
380
- key: 0,
381
- onClick: _cache[1] || (_cache[1] = ($event) => _ctx.$router.push({ name: "music-search" })),
382
- class: "bg-main radius-small pd-small mn-t-medium hover-scale-1",
383
- showLoader: false,
384
- showSucces: false
385
- }, {
386
- default: vue.withCtx(() => _cache[19] || (_cache[19] = [
387
- vue.createTextVNode(" Find Tracks ")
388
- ])),
389
- _: 1
390
- })) : vue.createCommentVNode("", true)
391
- ])) : (vue.openBlock(), vue.createBlock(Feed.default, {
392
- key: 1,
393
- store: {
394
- read: () => _ctx.Promise.resolve(playlistTracks.value),
395
- state: { isLoading: false }
396
- },
397
- external: true,
398
- items: playlistTracks.value,
399
- states: {
400
- empty: {
401
- title: "No tracks in playlist",
402
- description: "Add some tracks to get started",
403
- class: "pd-medium bg-dark-transp-10 radius-medium"
404
- }
405
- },
406
- class: "gap-thin"
407
- }, {
408
- default: vue.withCtx(({ items }) => [
409
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(items, (track) => {
410
- return vue.openBlock(), vue.createBlock(TrackCard.default, {
535
+ vue.createElementVNode("div", _hoisted_31, [
536
+ vue.createVNode(IconTime.default, { class: "i-medium t-primary" }),
537
+ vue.createElementVNode("div", null, [
538
+ _cache[21] || (_cache[21] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Duration", -1)),
539
+ vue.createElementVNode("div", _hoisted_32, vue.toDisplayString(totalDuration.value), 1)
540
+ ])
541
+ ]),
542
+ vue.createElementVNode("div", _hoisted_33, [
543
+ vue.createVNode(IconRefresh.default, { class: "i-medium t-primary" }),
544
+ vue.createElementVNode("div", null, [
545
+ _cache[22] || (_cache[22] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Updated", -1)),
546
+ vue.createElementVNode("div", _hoisted_34, vue.toDisplayString(formatDate(playlist.value.updatedAt)), 1)
547
+ ])
548
+ ]),
549
+ vue.createElementVNode("div", _hoisted_35, [
550
+ vue.createVNode(IconShow.default, { class: "i-medium t-primary" }),
551
+ vue.createElementVNode("div", null, [
552
+ _cache[23] || (_cache[23] = vue.createElementVNode("div", { class: "t-small t-transp t-uppercase" }, "Visibility", -1)),
553
+ vue.createElementVNode("div", _hoisted_36, vue.toDisplayString(playlist.value.isPublic ? "Public" : "Private"), 1)
554
+ ])
555
+ ])
556
+ ]),
557
+ playlist.value.tags && playlist.value.tags.length ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_37, [
558
+ _cache[24] || (_cache[24] = vue.createElementVNode("h3", { class: "t-medium mn-b-small" }, "Tags", -1)),
559
+ vue.createElementVNode("div", _hoisted_38, [
560
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(playlist.value.tags, (tag) => {
561
+ return vue.openBlock(), vue.createElementBlock("span", {
562
+ key: tag,
563
+ class: "tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer"
564
+ }, " #" + vue.toDisplayString(tag), 1);
565
+ }), 128))
566
+ ])
567
+ ])) : vue.createCommentVNode("", true),
568
+ playlist.value.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_39, [
569
+ _cache[25] || (_cache[25] = vue.createElementVNode("h3", { class: "t-medium mn-b-small" }, "About", -1)),
570
+ vue.createElementVNode("p", _hoisted_40, vue.toDisplayString(playlist.value.description), 1)
571
+ ])) : vue.createCommentVNode("", true)
572
+ ])
573
+ ])) : vue.createCommentVNode("", true),
574
+ !_ctx.isLoading && playlist.value && playlistTracks.value.length ? (vue.openBlock(), vue.createElementBlock("section", _hoisted_41, [
575
+ _cache[26] || (_cache[26] = vue.createElementVNode("h2", { class: "h2 mn-b-medium" }, "Tracklist", -1)),
576
+ vue.createVNode(Feed.default, {
577
+ store: {
578
+ read: () => _ctx.Promise.resolve(playlistTracks.value),
579
+ state: { isLoading: false }
580
+ },
581
+ external: true,
582
+ items: playlistTracks.value,
583
+ states: {
584
+ empty: {
585
+ title: "No tracks in playlist",
586
+ description: "Add some tracks to get started",
587
+ class: "pd-medium t-center"
588
+ }
589
+ }
590
+ }, {
591
+ default: vue.withCtx(({ items }) => [
592
+ vue.createElementVNode("div", _hoisted_42, [
593
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(items, (track, index) => {
594
+ return vue.openBlock(), vue.createBlock(TrackListCard.default, {
411
595
  key: track._id,
412
596
  track,
597
+ index: index + 1,
413
598
  showAlbum: true,
414
599
  showCover: true,
415
- class: "w-100 bg-dark-transp-10 radius-medium"
416
- }, null, 8, ["track"]);
600
+ canRemove: isOwner.value || isCollaborator.value,
601
+ onRemove: () => removeTrack(track._id)
602
+ }, null, 8, ["track", "index", "canRemove", "onRemove"]);
417
603
  }), 128))
418
- ]),
419
- _: 1
420
- }, 8, ["store", "items"]))
421
- ]),
422
- showEditModal.value && isOwner.value ? (vue.openBlock(), vue.createBlock(Popup.default, {
423
- key: 0,
424
- onClosePopup: _cache[8] || (_cache[8] = ($event) => showEditModal.value = false),
425
- class: "bg-dark pd-small w-m-25r radius-medium"
426
- }, {
427
- default: vue.withCtx(() => [
428
- _cache[28] || (_cache[28] = vue.createElementVNode("h3", { class: "mn-b-medium" }, "Edit Playlist", -1)),
429
- vue.createElementVNode("form", {
430
- onSubmit: vue.withModifiers(updatePlaylist, ["prevent"])
431
- }, [
432
- vue.createElementVNode("div", _hoisted_21, [
433
- _cache[22] || (_cache[22] = vue.createElementVNode("label", {
434
- for: "title",
435
- class: "t-medium mn-b-thin d-block"
436
- }, "Playlist Name", -1)),
437
- vue.createVNode(Field.default, {
438
- field: editForm.title,
439
- "onUpdate:field": _cache[2] || (_cache[2] = ($event) => editForm.title = $event),
440
- id: "title",
441
- type: "text",
442
- placeholder: "Playlist Name",
443
- validation: validationErrors.title,
444
- class: "w-100 pd-small bg-dark-transp-25 radius-small"
445
- }, null, 8, ["field", "validation"])
446
- ]),
447
- vue.createElementVNode("div", _hoisted_22, [
448
- _cache[23] || (_cache[23] = vue.createElementVNode("label", {
449
- for: "description",
450
- class: "t-medium mn-b-thin d-block"
451
- }, "Description", -1)),
452
- vue.createVNode(Field.default, {
453
- field: editForm.description,
454
- "onUpdate:field": _cache[3] || (_cache[3] = ($event) => editForm.description = $event),
455
- id: "description",
456
- type: "textarea",
457
- placeholder: "Add an optional description",
458
- class: "w-100 pd-small bg-dark-transp-25 radius-small"
459
- }, null, 8, ["field"])
460
- ]),
461
- vue.createElementVNode("div", _hoisted_23, [
462
- _cache[24] || (_cache[24] = vue.createElementVNode("label", { class: "t-medium mn-b-thin d-block" }, "Privacy", -1)),
463
- vue.createElementVNode("div", _hoisted_24, [
464
- vue.createVNode(Radio.default, {
465
- radio: editForm.isPublic,
466
- "onUpdate:radio": _cache[4] || (_cache[4] = ($event) => editForm.isPublic = $event),
467
- value: true,
468
- name: "privacy",
469
- label: "Public",
470
- class: ""
471
- }, null, 8, ["radio"]),
472
- vue.createVNode(Radio.default, {
473
- radio: editForm.isPublic,
474
- "onUpdate:radio": _cache[5] || (_cache[5] = ($event) => editForm.isPublic = $event),
475
- value: false,
476
- name: "privacy",
477
- label: "Private",
478
- class: ""
479
- }, null, 8, ["radio"])
480
- ])
481
- ]),
482
- vue.createElementVNode("div", _hoisted_25, [
483
- _cache[25] || (_cache[25] = vue.createElementVNode("label", { class: "t-medium mn-b-thin d-block" }, "Cover Image", -1)),
484
- vue.createElementVNode("div", _hoisted_26, [
485
- vue.createElementVNode("div", _hoisted_27, [
486
- editForm.coverUrl ? (vue.openBlock(), vue.createBlock(Media.default, {
487
- key: 0,
488
- url: editForm.coverUrl,
489
- class: "w-10r h-10r object-fit-cover"
490
- }, null, 8, ["url"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_28, [
491
- vue.createVNode(IconMusic.default, {
492
- class: "i-big",
493
- fill: "rgb(var(--grey))"
494
- })
495
- ]))
496
- ]),
497
- vue.createVNode(UploadImage.default, {
498
- photo: editForm.coverUrl,
499
- "onUpdate:photo": _cache[6] || (_cache[6] = ($event) => editForm.coverUrl = $event),
500
- uploadPath: "playlists",
501
- class: "flex-1 h-10r bg-dark-transp-25 radius-small"
502
- }, null, 8, ["photo"])
503
- ])
504
- ]),
505
- vue.createElementVNode("div", _hoisted_29, [
506
- vue.createVNode(Button.default, {
507
- onClick: _cache[7] || (_cache[7] = ($event) => showEditModal.value = false),
508
- type: "button",
509
- class: "bg-dark-transp-25 pd-small radius-small mn-r-small hover-bg-dark",
510
- showLoader: false,
511
- showSucces: false
512
- }, {
513
- default: vue.withCtx(() => _cache[26] || (_cache[26] = [
514
- vue.createTextVNode(" Cancel ")
515
- ])),
516
- _: 1
517
- }),
518
- vue.createVNode(Button.default, {
519
- type: "submit",
520
- class: "bg-main pd-small radius-small hover-scale-1",
521
- submit: updatePlaylist,
522
- showLoader: true,
523
- showSucces: true,
524
- validation: !!Object.keys(validationErrors).length
525
- }, {
526
- default: vue.withCtx(() => _cache[27] || (_cache[27] = [
527
- vue.createTextVNode(" Save ")
528
- ])),
529
- _: 1
530
- }, 8, ["validation"])
531
- ])
532
- ], 32)
533
- ]),
534
- _: 1
535
- })) : vue.createCommentVNode("", true),
536
- showDeleteModal.value ? (vue.openBlock(), vue.createBlock(Popup.default, {
537
- key: 1,
538
- onClosePopup: _cache[10] || (_cache[10] = ($event) => showDeleteModal.value = false),
539
- class: "bg-dark pd-small w-m-25r radius-medium"
540
- }, {
541
- default: vue.withCtx(() => [
542
- _cache[31] || (_cache[31] = vue.createElementVNode("h3", { class: "mn-b-medium" }, "Delete Playlist", -1)),
543
- _cache[32] || (_cache[32] = vue.createElementVNode("p", { class: "t-grey mn-b-medium" }, "Are you sure you want to delete this playlist? This action cannot be undone.", -1)),
544
- vue.createElementVNode("div", _hoisted_30, [
545
- vue.createVNode(Button.default, {
546
- onClick: _cache[9] || (_cache[9] = ($event) => showDeleteModal.value = false),
547
- class: "bg-dark-transp-25 pd-small radius-small mn-r-small hover-bg-dark",
548
- showLoader: false,
549
- showSucces: false
550
- }, {
551
- default: vue.withCtx(() => _cache[29] || (_cache[29] = [
552
- vue.createTextVNode(" Cancel ")
553
- ])),
554
- _: 1
555
- }),
556
- vue.createVNode(Button.default, {
557
- onClick: confirmDelete,
558
- class: "bg-fourth pd-small radius-small hover-scale-1",
559
- showLoader: true,
560
- showSucces: true
561
- }, {
562
- default: vue.withCtx(() => _cache[30] || (_cache[30] = [
563
- vue.createTextVNode(" Delete ")
564
- ])),
565
- _: 1
566
- })
567
604
  ])
568
605
  ]),
569
606
  _: 1
570
- })) : vue.createCommentVNode("", true)
571
- ]))
607
+ }, 8, ["store", "items"])
608
+ ])) : !_ctx.isLoading && playlist.value && !playlistTracks.value.length ? (vue.openBlock(), vue.createElementBlock("section", _hoisted_43, [
609
+ vue.createElementVNode("div", _hoisted_44, [
610
+ _cache[28] || (_cache[28] = vue.createElementVNode("h3", { class: "mn-b-small" }, "This playlist is empty", -1)),
611
+ _cache[29] || (_cache[29] = vue.createElementVNode("p", { class: "t-transp t-medium mn-b-medium" }, "Add some tracks to get started", -1)),
612
+ isOwner.value || isCollaborator.value ? (vue.openBlock(), vue.createBlock(Button.default, {
613
+ key: 0,
614
+ onClick: _cache[2] || (_cache[2] = ($event) => _ctx.$router.push({ name: "music-search" })),
615
+ color: "primary",
616
+ size: "medium"
617
+ }, {
618
+ default: vue.withCtx(() => _cache[27] || (_cache[27] = [
619
+ vue.createTextVNode(" Find Tracks ")
620
+ ])),
621
+ _: 1
622
+ })) : vue.createCommentVNode("", true)
623
+ ])
624
+ ])) : vue.createCommentVNode("", true),
625
+ !_ctx.isLoading && playlist.value && morePlaylists.value.length ? (vue.openBlock(), vue.createElementBlock("section", _hoisted_45, [
626
+ vue.createElementVNode("div", _hoisted_46, [
627
+ _cache[31] || (_cache[31] = vue.createElementVNode("h2", { class: "h2" }, "More Playlists", -1)),
628
+ playlist.value.creator ? (vue.openBlock(), vue.createBlock(_component_router_link, {
629
+ key: 0,
630
+ to: getOwnerProfileLink(playlist.value.creator),
631
+ class: "t-primary hover-opacity"
632
+ }, {
633
+ default: vue.withCtx(() => _cache[30] || (_cache[30] = [
634
+ vue.createTextVNode(" See all ")
635
+ ])),
636
+ _: 1
637
+ }, 8, ["to"])) : vue.createCommentVNode("", true)
638
+ ]),
639
+ vue.createElementVNode("div", _hoisted_47, [
640
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(morePlaylists.value, (relatedPlaylist) => {
641
+ return vue.openBlock(), vue.createElementBlock("li", {
642
+ key: relatedPlaylist._id,
643
+ class: "flex-none scroll-snap-align-start"
644
+ }, [
645
+ vue.createVNode(PlaylistCard.default, {
646
+ playlist: relatedPlaylist,
647
+ class: "w-min-15r transition-cubic-in-out"
648
+ }, null, 8, ["playlist"])
649
+ ]);
650
+ }), 128))
651
+ ])
652
+ ])) : vue.createCommentVNode("", true),
653
+ vue.createVNode(Popup.default, {
654
+ isPopupOpen: showEditModal.value && (isOwner.value || isCollaborator.value),
655
+ onClosePopup: _cache[4] || (_cache[4] = ($event) => showEditModal.value = false),
656
+ class: "bg-dark pd-medium w-m-30r radius-medium"
657
+ }, {
658
+ default: vue.withCtx(() => [
659
+ vue.createVNode(PlaylistForm.default, {
660
+ editMode: true,
661
+ url: playlist.value.url,
662
+ onCancel: _cache[3] || (_cache[3] = ($event) => showEditModal.value = false),
663
+ onUpdated: handlePlaylistUpdated
664
+ }, null, 8, ["url"])
665
+ ]),
666
+ _: 1
667
+ }, 8, ["isPopupOpen"]),
668
+ vue.createVNode(Popup.default, {
669
+ isPopupOpen: showDeleteModal.value,
670
+ onClosePopup: _cache[6] || (_cache[6] = ($event) => showDeleteModal.value = false),
671
+ class: "bg-dark pd-medium w-m-25r radius-medium"
672
+ }, {
673
+ default: vue.withCtx(() => [
674
+ _cache[34] || (_cache[34] = vue.createElementVNode("h3", { class: "mn-b-medium" }, "Delete Playlist", -1)),
675
+ vue.createElementVNode("p", _hoisted_48, 'Are you sure you want to delete "' + vue.toDisplayString(playlist.value.title) + '"? This action cannot be undone.', 1),
676
+ vue.createElementVNode("div", _hoisted_49, [
677
+ vue.createVNode(Button.default, {
678
+ onClick: _cache[5] || (_cache[5] = ($event) => showDeleteModal.value = false),
679
+ color: "transp",
680
+ size: "medium"
681
+ }, {
682
+ default: vue.withCtx(() => _cache[32] || (_cache[32] = [
683
+ vue.createTextVNode(" Cancel ")
684
+ ])),
685
+ _: 1
686
+ }),
687
+ vue.createVNode(Button.default, {
688
+ onClick: confirmDelete,
689
+ color: "danger",
690
+ size: "medium"
691
+ }, {
692
+ default: vue.withCtx(() => _cache[33] || (_cache[33] = [
693
+ vue.createTextVNode(" Delete Playlist ")
694
+ ])),
695
+ _: 1
696
+ })
697
+ ])
698
+ ]),
699
+ _: 1
700
+ }, 8, ["isPopupOpen"])
572
701
  ]);
573
702
  };
574
703
  }