@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
@@ -13,7 +13,7 @@ const IconEllipsis = require("../../../icons/navigation/IconEllipsis.vue.cjs");
13
13
  const AdjustmentForm = require("../forms/AdjustmentForm.vue.cjs");
14
14
  const StockAlertsForm = require("../forms/StockAlertsForm.vue.cjs");
15
15
  const HistoryView = require("../forms/HistoryView.vue.cjs");
16
- const ColumnSettingsMenu = require("../forms/ColumnSettingsMenu.vue.cjs");
16
+ const ColumnSettingsMenu = ;/* empty css */
17
17
  const _inventory_store = require("../../store/ inventory.store.cjs");
18
18
  const products = require("../../../products/store/products.cjs");
19
19
  const auth = require("../../../auth/views/store/auth.cjs");
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const Block = require("../../../../components/Block/Block.vue.cjs");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
- const Field = require("../../../../components/Field/Field.vue2.cjs");
6
+ const Field = require("../../../../components/Field/Field.vue.cjs");
7
7
  const Feed = require("../../../../components/Feed/Feed.vue.cjs");
8
8
  ;/* empty css */
9
9
  ;/* empty css */
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, withCtx, unref, Fragment, renderList, createBlock, createCommentVNode, toDisplayString } from "vue";
2
2
  import _sfc_main$4 from "../../../../components/Block/Block.vue.js";
3
3
  import _sfc_main$7 from "../../../../components/Button/Button.vue.js";
4
- import Field from "../../../../components/Field/Field.vue2.js";
4
+ import Field from "../../../../components/Field/Field.vue.js";
5
5
  import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
6
6
  /* empty css */
7
7
  /* empty css */
@@ -9,10 +9,13 @@ const albums = require("../../store/albums.cjs");
9
9
  ;/* empty css */
10
10
  const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.cjs");
11
11
  const _hoisted_1 = { class: "album-cover pos-relative" };
12
- const _hoisted_2 = { class: "album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out" };
13
- const _hoisted_3 = { class: "album-info pd-small bg-dark-transp-20" };
14
- const _hoisted_4 = { class: "t-medium t-truncate" };
15
- const _hoisted_5 = { class: "t-grey t-small t-truncate" };
12
+ const _hoisted_2 = {
13
+ key: 0,
14
+ class: "album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out"
15
+ };
16
+ const _hoisted_3 = { class: "album-info pd-medium bg-light" };
17
+ const _hoisted_4 = { class: "mn-b-thin t-medium t-truncate" };
18
+ const _hoisted_5 = { class: "t-transp t-small t-truncate" };
16
19
  const _sfc_main = {
17
20
  __name: "AlbumCard",
18
21
  props: {
@@ -26,10 +29,14 @@ const _sfc_main = {
26
29
  const albumInfo = vue.computed(() => {
27
30
  const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : "";
28
31
  let artistName = "Unknown Artist";
29
- if (props.album.artist?.name) {
32
+ if (props.album.artists && props.album.artists.length > 0) {
33
+ if (props.album.artists[0]?.name) {
34
+ artistName = props.album.artists.map((artist) => artist.name).join(", ");
35
+ } else if (typeof props.album.artists[0] === "string") {
36
+ artistName = "Various Artists";
37
+ }
38
+ } else if (props.album.artist?.name) {
30
39
  artistName = props.album.artist.name;
31
- } else if (typeof props.album.artist === "string") {
32
- artistName = props.album.artist;
33
40
  }
34
41
  return releaseYear ? `${artistName} • ${releaseYear}` : artistName;
35
42
  });
@@ -47,30 +54,30 @@ const _sfc_main = {
47
54
  const _component_router_link = vue.resolveComponent("router-link");
48
55
  return vue.openBlock(), vue.createBlock(_component_router_link, {
49
56
  to: { name: "album", params: { url: __props.album.url } },
50
- class: "album-card d-block radius-small o-hidden"
57
+ class: "album-card d-block radius-medium o-hidden"
51
58
  }, {
52
59
  default: vue.withCtx(() => [
53
60
  vue.createElementVNode("div", _hoisted_1, [
54
61
  vue.createVNode(Media.default, {
55
- url: __props.album.coverUrl || "/assets/placeholder-album.jpg",
62
+ url: __props.album.coverArt || __props.album.coverUrl || "/logo/logo-placeholder.jpg",
56
63
  class: "w-100 aspect-1x1 object-fit-cover"
57
64
  }, null, 8, ["url"]),
58
- vue.createElementVNode("div", _hoisted_2, [
65
+ __props.album.totalTracks && __props.album.totalTracks > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
59
66
  vue.createVNode(Button.default, {
60
- onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => playAlbum(__props.album), ["stop"])),
61
- class: "play-button bg-main radius-round flex-center flex aspect-1x1",
67
+ onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => playAlbum(__props.album), ["stop", "prevent"])),
68
+ class: "play-button i-big bg-main radius-round flex-center flex aspect-1x1",
62
69
  showLoader: false,
63
70
  showSucces: false
64
71
  }, {
65
72
  default: vue.withCtx(() => [
66
73
  vue.createVNode(IconPlay.default, {
67
74
  class: "i-small",
68
- fill: "rgb(var(--black))"
75
+ fill: "rgb(var(--white))"
69
76
  })
70
77
  ]),
71
78
  _: 1
72
79
  })
73
- ])
80
+ ])) : vue.createCommentVNode("", true)
74
81
  ]),
75
82
  vue.createElementVNode("div", _hoisted_3, [
76
83
  vue.createElementVNode("h3", _hoisted_4, vue.toDisplayString(__props.album.title), 1),
@@ -82,6 +89,6 @@ const _sfc_main = {
82
89
  };
83
90
  }
84
91
  };
85
- const AlbumCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-6163e3e6"]]);
92
+ const AlbumCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-faf7f060"]]);
86
93
  exports.default = AlbumCard;
87
94
  //# sourceMappingURL=AlbumCard.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AlbumCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/AlbumCard.vue"],"sourcesContent":["<!-- components/cards/AlbumCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'album', params: { url: album.url } }\" \n class=\"album-card d-block radius-small o-hidden\"\n >\n <div class=\"album-cover pos-relative\">\n <Media \n :url=\"album.coverUrl || '/assets/placeholder-album.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div class=\"album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop=\"playAlbum(album)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"album-info pd-small bg-dark-transp-20\">\n <h3 class=\" t-medium t-truncate\">{{ album.title }}</h3>\n <p class=\"t-grey t-small t-truncate\">{{ albumInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store & albums store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\n\nconst props = defineProps({\n album: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst albumInfo = computed(() => {\n const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : '';\n let artistName = 'Unknown Artist';\n \n if (props.album.artist?.name) {\n artistName = props.album.artist.name;\n } else if (typeof props.album.artist === 'string') {\n artistName = props.album.artist;\n }\n \n return releaseYear ? `${artistName} • ${releaseYear}` : artistName;\n});\n\n// Methods\nconst playAlbum = async (album) => {\n // If album tracks are already loaded in state, use those\n if (albumsState.currentAlbum && albumsState.currentAlbum._id === album._id && albumsState.currentAlbumTracks.length > 0) {\n playerActions.setQueue(albumsState.currentAlbumTracks);\n return;\n }\n \n // Otherwise fetch tracks for this album\n const tracks = await albumsActions.fetchAlbumTracks(album._id);\n \n if (tracks && tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.album-card {\n transition: transform 0.3s ease;\n}\n\n.album-card:hover {\n transform: translateY(-5px);\n}\n\n.album-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.album-card:hover .album-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.album-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["computed","albumsState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,YAAM,cAAc,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,MAAM,WAAW,EAAE,YAAW,IAAK;AAChG,UAAI,aAAa;AAEjB,UAAI,MAAM,MAAM,QAAQ,MAAM;AAC5B,qBAAa,MAAM,MAAM,OAAO;AAAA,MAClC,WAAW,OAAO,MAAM,MAAM,WAAW,UAAU;AACjD,qBAAa,MAAM,MAAM;AAAA,MAC3B;AAEA,aAAO,cAAc,GAAG,UAAU,MAAM,WAAW,KAAK;AAAA,IAC1D,CAAC;AAGD,UAAM,YAAY,OAAO,UAAU;AAEjC,UAAIC,aAAY,gBAAgBA,OAAAA,MAAY,aAAa,QAAQ,MAAM,OAAOA,OAAAA,MAAY,mBAAmB,SAAS,GAAG;AACvHC,uBAAc,SAASD,OAAAA,MAAY,kBAAkB;AACrD;AAAA,MACF;AAGA,YAAM,SAAS,MAAME,OAAAA,QAAc,iBAAiB,MAAM,GAAG;AAE7D,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/BD,eAAAA,QAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"AlbumCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/AlbumCard.vue"],"sourcesContent":["<!-- components/cards/AlbumCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'album', params: { url: album.url } }\" \n class=\"album-card d-block radius-medium o-hidden\"\n >\n <div class=\"album-cover pos-relative\">\n <Media \n :url=\"album.coverArt || album.coverUrl || '/logo/logo-placeholder.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div v-if=\"album.totalTracks && album.totalTracks > 0\" class=\"album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop.prevent=\"playAlbum(album)\" \n class=\"play-button i-big bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--white))\" />\n </Button>\n </div>\n </div>\n <div class=\"album-info pd-medium bg-light\">\n <h3 class=\"mn-b-thin t-medium t-truncate\">{{ album.title }}</h3>\n <p class=\"t-transp t-small t-truncate\">{{ albumInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store & albums store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\n\nconst props = defineProps({\n album: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst albumInfo = computed(() => {\n const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : '';\n let artistName = 'Unknown Artist';\n \n // Handle artists array (model uses 'artists' not 'artist')\n if (props.album.artists && props.album.artists.length > 0) {\n // If populated, artists[0] will have name property\n if (props.album.artists[0]?.name) {\n artistName = props.album.artists.map(artist => artist.name).join(', ');\n } else if (typeof props.album.artists[0] === 'string') {\n // If not populated, it might be just IDs\n artistName = 'Various Artists';\n }\n } else if (props.album.artist?.name) {\n // Fallback for old data structure\n artistName = props.album.artist.name;\n }\n \n return releaseYear ? `${artistName} • ${releaseYear}` : artistName;\n});\n\n// Methods\nconst playAlbum = async (album) => {\n // If album tracks are already loaded in state, use those\n if (albumsState.currentAlbum && albumsState.currentAlbum._id === album._id && albumsState.currentAlbumTracks.length > 0) {\n playerActions.setQueue(albumsState.currentAlbumTracks);\n return;\n }\n \n // Otherwise fetch tracks for this album\n const tracks = await albumsActions.fetchAlbumTracks(album._id);\n \n if (tracks && tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.album-card {\n transition: transform 0.3s ease;\n}\n\n.album-card:hover {\n transform: translateY(-5px);\n}\n\n.album-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.album-card:hover .album-overlay {\n opacity: 1;\n}\n\n.play-button {\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.album-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["computed","albumsState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,YAAYA,IAAAA,SAAS,MAAM;AAC/B,YAAM,cAAc,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,MAAM,WAAW,EAAE,YAAW,IAAK;AAChG,UAAI,aAAa;AAGjB,UAAI,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,GAAG;AAEzD,YAAI,MAAM,MAAM,QAAQ,CAAC,GAAG,MAAM;AAChC,uBAAa,MAAM,MAAM,QAAQ,IAAI,YAAU,OAAO,IAAI,EAAE,KAAK,IAAI;AAAA,QACvE,WAAW,OAAO,MAAM,MAAM,QAAQ,CAAC,MAAM,UAAU;AAErD,uBAAa;AAAA,QACf;AAAA,MACF,WAAW,MAAM,MAAM,QAAQ,MAAM;AAEnC,qBAAa,MAAM,MAAM,OAAO;AAAA,MAClC;AAEA,aAAO,cAAc,GAAG,UAAU,MAAM,WAAW,KAAK;AAAA,IAC1D,CAAC;AAGD,UAAM,YAAY,OAAO,UAAU;AAEjC,UAAIC,aAAY,gBAAgBA,OAAAA,MAAY,aAAa,QAAQ,MAAM,OAAOA,OAAAA,MAAY,mBAAmB,SAAS,GAAG;AACvHC,uBAAc,SAASD,OAAAA,MAAY,kBAAkB;AACrD;AAAA,MACF;AAGA,YAAM,SAAS,MAAME,OAAAA,QAAc,iBAAiB,MAAM,GAAG;AAE7D,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/BD,eAAAA,QAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, withModifiers, toDisplayString } from "vue";
1
+ import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, withModifiers, toDisplayString } from "vue";
2
2
  import Media from "../../../../components/Media/Media.vue.js";
3
3
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
4
  import _sfc_main$2 from "../../../icons/navigation/IconPlay.vue.js";
@@ -7,10 +7,13 @@ import { state, actions as actions$1 } from "../../store/albums.js";
7
7
  /* empty css */
8
8
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
9
9
  const _hoisted_1 = { class: "album-cover pos-relative" };
10
- const _hoisted_2 = { class: "album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out" };
11
- const _hoisted_3 = { class: "album-info pd-small bg-dark-transp-20" };
12
- const _hoisted_4 = { class: "t-medium t-truncate" };
13
- const _hoisted_5 = { class: "t-grey t-small t-truncate" };
10
+ const _hoisted_2 = {
11
+ key: 0,
12
+ class: "album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out"
13
+ };
14
+ const _hoisted_3 = { class: "album-info pd-medium bg-light" };
15
+ const _hoisted_4 = { class: "mn-b-thin t-medium t-truncate" };
16
+ const _hoisted_5 = { class: "t-transp t-small t-truncate" };
14
17
  const _sfc_main = {
15
18
  __name: "AlbumCard",
16
19
  props: {
@@ -24,10 +27,14 @@ const _sfc_main = {
24
27
  const albumInfo = computed(() => {
25
28
  const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : "";
26
29
  let artistName = "Unknown Artist";
27
- if (props.album.artist?.name) {
30
+ if (props.album.artists && props.album.artists.length > 0) {
31
+ if (props.album.artists[0]?.name) {
32
+ artistName = props.album.artists.map((artist) => artist.name).join(", ");
33
+ } else if (typeof props.album.artists[0] === "string") {
34
+ artistName = "Various Artists";
35
+ }
36
+ } else if (props.album.artist?.name) {
28
37
  artistName = props.album.artist.name;
29
- } else if (typeof props.album.artist === "string") {
30
- artistName = props.album.artist;
31
38
  }
32
39
  return releaseYear ? `${artistName} • ${releaseYear}` : artistName;
33
40
  });
@@ -45,30 +52,30 @@ const _sfc_main = {
45
52
  const _component_router_link = resolveComponent("router-link");
46
53
  return openBlock(), createBlock(_component_router_link, {
47
54
  to: { name: "album", params: { url: __props.album.url } },
48
- class: "album-card d-block radius-small o-hidden"
55
+ class: "album-card d-block radius-medium o-hidden"
49
56
  }, {
50
57
  default: withCtx(() => [
51
58
  createElementVNode("div", _hoisted_1, [
52
59
  createVNode(Media, {
53
- url: __props.album.coverUrl || "/assets/placeholder-album.jpg",
60
+ url: __props.album.coverArt || __props.album.coverUrl || "/logo/logo-placeholder.jpg",
54
61
  class: "w-100 aspect-1x1 object-fit-cover"
55
62
  }, null, 8, ["url"]),
56
- createElementVNode("div", _hoisted_2, [
63
+ __props.album.totalTracks && __props.album.totalTracks > 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
57
64
  createVNode(_sfc_main$1, {
58
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => playAlbum(__props.album), ["stop"])),
59
- class: "play-button bg-main radius-round flex-center flex aspect-1x1",
65
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => playAlbum(__props.album), ["stop", "prevent"])),
66
+ class: "play-button i-big bg-main radius-round flex-center flex aspect-1x1",
60
67
  showLoader: false,
61
68
  showSucces: false
62
69
  }, {
63
70
  default: withCtx(() => [
64
71
  createVNode(_sfc_main$2, {
65
72
  class: "i-small",
66
- fill: "rgb(var(--black))"
73
+ fill: "rgb(var(--white))"
67
74
  })
68
75
  ]),
69
76
  _: 1
70
77
  })
71
- ])
78
+ ])) : createCommentVNode("", true)
72
79
  ]),
73
80
  createElementVNode("div", _hoisted_3, [
74
81
  createElementVNode("h3", _hoisted_4, toDisplayString(__props.album.title), 1),
@@ -80,7 +87,7 @@ const _sfc_main = {
80
87
  };
81
88
  }
82
89
  };
83
- const AlbumCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6163e3e6"]]);
90
+ const AlbumCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-faf7f060"]]);
84
91
  export {
85
92
  AlbumCard as default
86
93
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AlbumCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/AlbumCard.vue"],"sourcesContent":["<!-- components/cards/AlbumCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'album', params: { url: album.url } }\" \n class=\"album-card d-block radius-small o-hidden\"\n >\n <div class=\"album-cover pos-relative\">\n <Media \n :url=\"album.coverUrl || '/assets/placeholder-album.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div class=\"album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop=\"playAlbum(album)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"album-info pd-small bg-dark-transp-20\">\n <h3 class=\" t-medium t-truncate\">{{ album.title }}</h3>\n <p class=\"t-grey t-small t-truncate\">{{ albumInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store & albums store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\n\nconst props = defineProps({\n album: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst albumInfo = computed(() => {\n const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : '';\n let artistName = 'Unknown Artist';\n \n if (props.album.artist?.name) {\n artistName = props.album.artist.name;\n } else if (typeof props.album.artist === 'string') {\n artistName = props.album.artist;\n }\n \n return releaseYear ? `${artistName} • ${releaseYear}` : artistName;\n});\n\n// Methods\nconst playAlbum = async (album) => {\n // If album tracks are already loaded in state, use those\n if (albumsState.currentAlbum && albumsState.currentAlbum._id === album._id && albumsState.currentAlbumTracks.length > 0) {\n playerActions.setQueue(albumsState.currentAlbumTracks);\n return;\n }\n \n // Otherwise fetch tracks for this album\n const tracks = await albumsActions.fetchAlbumTracks(album._id);\n \n if (tracks && tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.album-card {\n transition: transform 0.3s ease;\n}\n\n.album-card:hover {\n transform: translateY(-5px);\n}\n\n.album-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.album-card:hover .album-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.album-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["albumsState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,cAAc,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,MAAM,WAAW,EAAE,YAAW,IAAK;AAChG,UAAI,aAAa;AAEjB,UAAI,MAAM,MAAM,QAAQ,MAAM;AAC5B,qBAAa,MAAM,MAAM,OAAO;AAAA,MAClC,WAAW,OAAO,MAAM,MAAM,WAAW,UAAU;AACjD,qBAAa,MAAM,MAAM;AAAA,MAC3B;AAEA,aAAO,cAAc,GAAG,UAAU,MAAM,WAAW,KAAK;AAAA,IAC1D,CAAC;AAGD,UAAM,YAAY,OAAO,UAAU;AAEjC,UAAIA,MAAY,gBAAgBA,MAAY,aAAa,QAAQ,MAAM,OAAOA,MAAY,mBAAmB,SAAS,GAAG;AACvHC,gBAAc,SAASD,MAAY,kBAAkB;AACrD;AAAA,MACF;AAGA,YAAM,SAAS,MAAME,UAAc,iBAAiB,MAAM,GAAG;AAE7D,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/BD,gBAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"AlbumCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/AlbumCard.vue"],"sourcesContent":["<!-- components/cards/AlbumCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'album', params: { url: album.url } }\" \n class=\"album-card d-block radius-medium o-hidden\"\n >\n <div class=\"album-cover pos-relative\">\n <Media \n :url=\"album.coverArt || album.coverUrl || '/logo/logo-placeholder.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div v-if=\"album.totalTracks && album.totalTracks > 0\" class=\"album-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop.prevent=\"playAlbum(album)\" \n class=\"play-button i-big bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--white))\" />\n </Button>\n </div>\n </div>\n <div class=\"album-info pd-medium bg-light\">\n <h3 class=\"mn-b-thin t-medium t-truncate\">{{ album.title }}</h3>\n <p class=\"t-transp t-small t-truncate\">{{ albumInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store & albums store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\n\nconst props = defineProps({\n album: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst albumInfo = computed(() => {\n const releaseYear = props.album.releaseDate ? new Date(props.album.releaseDate).getFullYear() : '';\n let artistName = 'Unknown Artist';\n \n // Handle artists array (model uses 'artists' not 'artist')\n if (props.album.artists && props.album.artists.length > 0) {\n // If populated, artists[0] will have name property\n if (props.album.artists[0]?.name) {\n artistName = props.album.artists.map(artist => artist.name).join(', ');\n } else if (typeof props.album.artists[0] === 'string') {\n // If not populated, it might be just IDs\n artistName = 'Various Artists';\n }\n } else if (props.album.artist?.name) {\n // Fallback for old data structure\n artistName = props.album.artist.name;\n }\n \n return releaseYear ? `${artistName} • ${releaseYear}` : artistName;\n});\n\n// Methods\nconst playAlbum = async (album) => {\n // If album tracks are already loaded in state, use those\n if (albumsState.currentAlbum && albumsState.currentAlbum._id === album._id && albumsState.currentAlbumTracks.length > 0) {\n playerActions.setQueue(albumsState.currentAlbumTracks);\n return;\n }\n \n // Otherwise fetch tracks for this album\n const tracks = await albumsActions.fetchAlbumTracks(album._id);\n \n if (tracks && tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.album-card {\n transition: transform 0.3s ease;\n}\n\n.album-card:hover {\n transform: translateY(-5px);\n}\n\n.album-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.album-card:hover .album-overlay {\n opacity: 1;\n}\n\n.play-button {\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.album-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["albumsState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,cAAc,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,MAAM,WAAW,EAAE,YAAW,IAAK;AAChG,UAAI,aAAa;AAGjB,UAAI,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,GAAG;AAEzD,YAAI,MAAM,MAAM,QAAQ,CAAC,GAAG,MAAM;AAChC,uBAAa,MAAM,MAAM,QAAQ,IAAI,YAAU,OAAO,IAAI,EAAE,KAAK,IAAI;AAAA,QACvE,WAAW,OAAO,MAAM,MAAM,QAAQ,CAAC,MAAM,UAAU;AAErD,uBAAa;AAAA,QACf;AAAA,MACF,WAAW,MAAM,MAAM,QAAQ,MAAM;AAEnC,qBAAa,MAAM,MAAM,OAAO;AAAA,MAClC;AAEA,aAAO,cAAc,GAAG,UAAU,MAAM,WAAW,KAAK;AAAA,IAC1D,CAAC;AAGD,UAAM,YAAY,OAAO,UAAU;AAEjC,UAAIA,MAAY,gBAAgBA,MAAY,aAAa,QAAQ,MAAM,OAAOA,MAAY,mBAAmB,SAAS,GAAG;AACvHC,gBAAc,SAASD,MAAY,kBAAkB;AACrD;AAAA,MACF;AAGA,YAAM,SAAS,MAAME,UAAc,iBAAiB,MAAM,GAAG;AAE7D,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/BD,gBAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -13,7 +13,7 @@ const _hoisted_3 = {
13
13
  const _hoisted_4 = { class: "h3" };
14
14
  const _hoisted_5 = { class: "p-small" };
15
15
  const _hoisted_6 = { class: "pd-small" };
16
- const _hoisted_7 = { class: "mn-b-micro t-trim-2" };
16
+ const _hoisted_7 = { class: "t-medium mn-b-small t-truncate" };
17
17
  const _hoisted_8 = {
18
18
  key: 0,
19
19
  class: "p-small t-transp t-trim"
@@ -79,6 +79,6 @@ const _sfc_main = {
79
79
  };
80
80
  }
81
81
  };
82
- const ArtistCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-c2372a41"]]);
82
+ const ArtistCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-648ab17c"]]);
83
83
  exports.default = ArtistCard;
84
84
  //# sourceMappingURL=ArtistCard.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ArtistCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/ArtistCard.vue"],"sourcesContent":["<template>\n <div \n class=\"artist-card flex flex-column radius-medium o-hidden bg-white\"\n :class=\"{ 'cursor-pointer hover-scale-1': clickable }\"\n @click=\"handleClick\"\n >\n <div class=\"artist-image w-100 pos-relative aspect-1x1\">\n <img \n v-if=\"artist.photo\" \n :src=\"FILE_SERVER_URL + artist.photo\" \n :alt=\"artist.name\"\n class=\"w-100 h-100 object-fit-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"w-100 h-100 bg-light flex-center flex\">\n <span class=\"h3\">{{ artist.name ? artist.name.charAt(0) : '?' }}</span>\n </div>\n \n <div \n v-if=\"showStatus\" \n class=\"pos-absolute pos-t-small pos-r-small pd-micro radius-medium\"\n :class=\"{\n 'bg-second': artist.status === 'published',\n 'bg-fifth': artist.status === 'featured',\n 'bg-grey': artist.status === 'draft'\n }\"\n >\n <span class=\" p-small\">{{ artist.status }}</span>\n </div>\n </div>\n \n <div class=\"pd-small\">\n <h4 class=\"mn-b-micro t-trim-2\">{{ artist.name }}</h4>\n <p v-if=\"artist.genres && artist.genres.length\" class=\"p-small t-transp t-trim\">\n {{ artist.genres.join(', ') }}\n </p>\n </div>\n \n <slot name=\"actions\"></slot>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst props = defineProps({\n artist: {\n type: Object,\n required: true\n },\n clickable: {\n type: Boolean,\n default: true\n },\n showStatus: {\n type: Boolean,\n default: false\n }\n});\n\nconst router = useRouter();\n\nconst handleClick = () => {\n if (!props.clickable) return;\n \n router.push({\n name: 'artist',\n params: { url: props.artist.url }\n });\n};\n</script>\n\n<style scoped>\n.artist-card {\n border: 1px solid rgba(var(--grey), 0.2);\n transition: transform 0.2s ease;\n}\n\n.hover-scale-1:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n</style>"],"names":["useRouter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,UAAM,QAAQ;AAed,UAAM,SAASA,UAAAA,UAAS;AAExB,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,MAAM,UAAW;AAEtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,IAAG;AAAA,MACnC,CAAG;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ArtistCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/ArtistCard.vue"],"sourcesContent":["<template>\n <div \n class=\"artist-card flex flex-column radius-medium o-hidden bg-white\"\n :class=\"{ 'cursor-pointer hover-scale-1': clickable }\"\n @click=\"handleClick\"\n >\n <div class=\"artist-image w-100 pos-relative aspect-1x1\">\n <img \n v-if=\"artist.photo\" \n :src=\"FILE_SERVER_URL + artist.photo\" \n :alt=\"artist.name\"\n class=\"w-100 h-100 object-fit-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"w-100 h-100 bg-light flex-center flex\">\n <span class=\"h3\">{{ artist.name ? artist.name.charAt(0) : '?' }}</span>\n </div>\n \n <div \n v-if=\"showStatus\" \n class=\"pos-absolute pos-t-small pos-r-small pd-micro radius-medium\"\n :class=\"{\n 'bg-second': artist.status === 'published',\n 'bg-fifth': artist.status === 'featured',\n 'bg-grey': artist.status === 'draft'\n }\"\n >\n <span class=\" p-small\">{{ artist.status }}</span>\n </div>\n </div>\n \n <div class=\"pd-small\">\n <h4 class=\"t-medium mn-b-small t-truncate\">{{ artist.name }}</h4>\n <p v-if=\"artist.genres && artist.genres.length\" class=\"p-small t-transp t-trim\">\n {{ artist.genres.join(', ') }}\n </p>\n </div>\n \n <slot name=\"actions\"></slot>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst props = defineProps({\n artist: {\n type: Object,\n required: true\n },\n clickable: {\n type: Boolean,\n default: true\n },\n showStatus: {\n type: Boolean,\n default: false\n }\n});\n\nconst router = useRouter();\n\nconst handleClick = () => {\n if (!props.clickable) return;\n \n router.push({\n name: 'artist',\n params: { url: props.artist.url }\n });\n};\n</script>\n\n<style scoped>\n.artist-card {\n border: 1px solid rgba(var(--grey), 0.2);\n transition: transform 0.2s ease;\n}\n\n.hover-scale-1:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n</style>"],"names":["useRouter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,UAAM,QAAQ;AAed,UAAM,SAASA,UAAAA,UAAS;AAExB,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,MAAM,UAAW;AAEtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,IAAG;AAAA,MACnC,CAAG;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -11,7 +11,7 @@ const _hoisted_3 = {
11
11
  const _hoisted_4 = { class: "h3" };
12
12
  const _hoisted_5 = { class: "p-small" };
13
13
  const _hoisted_6 = { class: "pd-small" };
14
- const _hoisted_7 = { class: "mn-b-micro t-trim-2" };
14
+ const _hoisted_7 = { class: "t-medium mn-b-small t-truncate" };
15
15
  const _hoisted_8 = {
16
16
  key: 0,
17
17
  class: "p-small t-transp t-trim"
@@ -77,7 +77,7 @@ const _sfc_main = {
77
77
  };
78
78
  }
79
79
  };
80
- const ArtistCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c2372a41"]]);
80
+ const ArtistCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-648ab17c"]]);
81
81
  export {
82
82
  ArtistCard as default
83
83
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ArtistCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/ArtistCard.vue"],"sourcesContent":["<template>\n <div \n class=\"artist-card flex flex-column radius-medium o-hidden bg-white\"\n :class=\"{ 'cursor-pointer hover-scale-1': clickable }\"\n @click=\"handleClick\"\n >\n <div class=\"artist-image w-100 pos-relative aspect-1x1\">\n <img \n v-if=\"artist.photo\" \n :src=\"FILE_SERVER_URL + artist.photo\" \n :alt=\"artist.name\"\n class=\"w-100 h-100 object-fit-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"w-100 h-100 bg-light flex-center flex\">\n <span class=\"h3\">{{ artist.name ? artist.name.charAt(0) : '?' }}</span>\n </div>\n \n <div \n v-if=\"showStatus\" \n class=\"pos-absolute pos-t-small pos-r-small pd-micro radius-medium\"\n :class=\"{\n 'bg-second': artist.status === 'published',\n 'bg-fifth': artist.status === 'featured',\n 'bg-grey': artist.status === 'draft'\n }\"\n >\n <span class=\" p-small\">{{ artist.status }}</span>\n </div>\n </div>\n \n <div class=\"pd-small\">\n <h4 class=\"mn-b-micro t-trim-2\">{{ artist.name }}</h4>\n <p v-if=\"artist.genres && artist.genres.length\" class=\"p-small t-transp t-trim\">\n {{ artist.genres.join(', ') }}\n </p>\n </div>\n \n <slot name=\"actions\"></slot>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst props = defineProps({\n artist: {\n type: Object,\n required: true\n },\n clickable: {\n type: Boolean,\n default: true\n },\n showStatus: {\n type: Boolean,\n default: false\n }\n});\n\nconst router = useRouter();\n\nconst handleClick = () => {\n if (!props.clickable) return;\n \n router.push({\n name: 'artist',\n params: { url: props.artist.url }\n });\n};\n</script>\n\n<style scoped>\n.artist-card {\n border: 1px solid rgba(var(--grey), 0.2);\n transition: transform 0.2s ease;\n}\n\n.hover-scale-1:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,UAAM,QAAQ;AAed,UAAM,SAAS,UAAS;AAExB,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,MAAM,UAAW;AAEtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,IAAG;AAAA,MACnC,CAAG;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ArtistCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/ArtistCard.vue"],"sourcesContent":["<template>\n <div \n class=\"artist-card flex flex-column radius-medium o-hidden bg-white\"\n :class=\"{ 'cursor-pointer hover-scale-1': clickable }\"\n @click=\"handleClick\"\n >\n <div class=\"artist-image w-100 pos-relative aspect-1x1\">\n <img \n v-if=\"artist.photo\" \n :src=\"FILE_SERVER_URL + artist.photo\" \n :alt=\"artist.name\"\n class=\"w-100 h-100 object-fit-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"w-100 h-100 bg-light flex-center flex\">\n <span class=\"h3\">{{ artist.name ? artist.name.charAt(0) : '?' }}</span>\n </div>\n \n <div \n v-if=\"showStatus\" \n class=\"pos-absolute pos-t-small pos-r-small pd-micro radius-medium\"\n :class=\"{\n 'bg-second': artist.status === 'published',\n 'bg-fifth': artist.status === 'featured',\n 'bg-grey': artist.status === 'draft'\n }\"\n >\n <span class=\" p-small\">{{ artist.status }}</span>\n </div>\n </div>\n \n <div class=\"pd-small\">\n <h4 class=\"t-medium mn-b-small t-truncate\">{{ artist.name }}</h4>\n <p v-if=\"artist.genres && artist.genres.length\" class=\"p-small t-transp t-trim\">\n {{ artist.genres.join(', ') }}\n </p>\n </div>\n \n <slot name=\"actions\"></slot>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\n\nconst props = defineProps({\n artist: {\n type: Object,\n required: true\n },\n clickable: {\n type: Boolean,\n default: true\n },\n showStatus: {\n type: Boolean,\n default: false\n }\n});\n\nconst router = useRouter();\n\nconst handleClick = () => {\n if (!props.clickable) return;\n \n router.push({\n name: 'artist',\n params: { url: props.artist.url }\n });\n};\n</script>\n\n<style scoped>\n.artist-card {\n border: 1px solid rgba(var(--grey), 0.2);\n transition: transform 0.2s ease;\n}\n\n.hover-scale-1:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,UAAM,QAAQ;AAed,UAAM,SAAS,UAAS;AAExB,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,MAAM,UAAW;AAEtB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,IAAG;AAAA,MACnC,CAAG;AAAA,IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -5,13 +5,17 @@ const Media = require("../../../../components/Media/Media.vue.cjs");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
6
  const IconPlay = require("../../../icons/navigation/IconPlay.vue.cjs");
7
7
  const player = require("../../store/player.cjs");
8
+ const playlists = require("../../store/playlists.cjs");
8
9
  ;/* empty css */
9
10
  const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.cjs");
10
11
  const _hoisted_1 = { class: "playlist-cover pos-relative" };
11
- const _hoisted_2 = { class: "playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out" };
12
- const _hoisted_3 = { class: "playlist-info pd-small bg-dark-transp-20" };
13
- const _hoisted_4 = { class: "t-medium t-truncate" };
14
- const _hoisted_5 = { class: "t-grey t-small t-truncate" };
12
+ const _hoisted_2 = {
13
+ key: 0,
14
+ class: "playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out"
15
+ };
16
+ const _hoisted_3 = { class: "playlist-info pd-small bg-light" };
17
+ const _hoisted_4 = { class: "t-medium mn-b-small t-truncate" };
18
+ const _hoisted_5 = { class: "t-transp t-small t-truncate" };
15
19
  const _sfc_main = {
16
20
  __name: "PlaylistCard",
17
21
  props: {
@@ -32,10 +36,24 @@ const _sfc_main = {
32
36
  }
33
37
  return `${creatorName} • ${trackCount} ${trackCount === 1 ? "track" : "tracks"}`;
34
38
  });
35
- const playPlaylist = (playlist) => {
36
- const tracks = playlist.tracks?.map((item) => item.track).filter((track) => track) || [];
37
- if (tracks.length > 0) {
38
- player.actions.setQueue(tracks);
39
+ const playPlaylist = async (playlist) => {
40
+ if (!playlist || !playlist.url) {
41
+ console.warn("Playlist or URL not available");
42
+ return;
43
+ }
44
+ try {
45
+ console.log("Loading playlist:", playlist.url);
46
+ await playlists.actions.fetchPlaylistByUrl(playlist.url);
47
+ const tracks = playlists.state.currentPlaylistTracks || [];
48
+ console.log("Loaded tracks:", tracks);
49
+ if (tracks.length > 0) {
50
+ console.log("Setting queue with tracks:", tracks);
51
+ player.actions.setQueue(tracks);
52
+ } else {
53
+ console.warn("No tracks found in playlist after loading");
54
+ }
55
+ } catch (error) {
56
+ console.error("Error loading playlist for playback:", error);
39
57
  }
40
58
  };
41
59
  return (_ctx, _cache) => {
@@ -47,12 +65,12 @@ const _sfc_main = {
47
65
  default: vue.withCtx(() => [
48
66
  vue.createElementVNode("div", _hoisted_1, [
49
67
  vue.createVNode(Media.default, {
50
- url: __props.playlist.coverUrl || "/assets/placeholder-playlist.jpg",
68
+ url: __props.playlist.coverUrl || "/logo/logo-placeholder.jpg",
51
69
  class: "w-100 aspect-1x1 object-fit-cover"
52
70
  }, null, 8, ["url"]),
53
- vue.createElementVNode("div", _hoisted_2, [
71
+ __props.playlist.tracks && __props.playlist.tracks.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
54
72
  vue.createVNode(Button.default, {
55
- onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => playPlaylist(__props.playlist), ["stop"])),
73
+ onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => playPlaylist(__props.playlist), ["stop", "prevent"])),
56
74
  class: "play-button bg-main radius-round flex-center flex aspect-1x1",
57
75
  showLoader: false,
58
76
  showSucces: false
@@ -65,7 +83,7 @@ const _sfc_main = {
65
83
  ]),
66
84
  _: 1
67
85
  })
68
- ])
86
+ ])) : vue.createCommentVNode("", true)
69
87
  ]),
70
88
  vue.createElementVNode("div", _hoisted_3, [
71
89
  vue.createElementVNode("h3", _hoisted_4, vue.toDisplayString(__props.playlist.title), 1),
@@ -77,6 +95,6 @@ const _sfc_main = {
77
95
  };
78
96
  }
79
97
  };
80
- const PlaylistCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-238f47e7"]]);
98
+ const PlaylistCard = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["__scopeId", "data-v-be2a71af"]]);
81
99
  exports.default = PlaylistCard;
82
100
  //# sourceMappingURL=PlaylistCard.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaylistCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/PlaylistCard.vue"],"sourcesContent":["<!-- components/cards/PlaylistCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'playlist', params: { url: playlist.url } }\" \n class=\"playlist-card d-block radius-small o-hidden\"\n >\n <div class=\"playlist-cover pos-relative\">\n <Media \n :url=\"playlist.coverUrl || '/assets/placeholder-playlist.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div class=\"playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop=\"playPlaylist(playlist)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"playlist-info pd-small bg-dark-transp-20\">\n <h3 class=\" t-medium t-truncate\">{{ playlist.title }}</h3>\n <p class=\"t-grey t-small t-truncate\">{{ playlistInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store\nimport { actions as playerActions } from '../../store/player.js';\n\nconst props = defineProps({\n playlist: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst playlistInfo = computed(() => {\n const trackCount = props.playlist.tracks?.length || 0;\n let creatorName = 'Unknown';\n \n if (props.playlist.creator?.target?.profile?.name) {\n creatorName = props.playlist.creator.target.profile.name;\n } else if (props.playlist.creator?.target?.name) {\n creatorName = props.playlist.creator.target.name;\n }\n \n return `${creatorName} • ${trackCount} ${trackCount === 1 ? 'track' : 'tracks'}`;\n});\n\n// Methods\nconst playPlaylist = (playlist) => {\n // Extract tracks from playlist\n const tracks = playlist.tracks?.map(item => item.track).filter(track => track) || [];\n \n if (tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.playlist-card {\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover {\n transform: translateY(-5px);\n}\n\n.playlist-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.playlist-card:hover .playlist-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["computed","playerActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsCA,UAAM,QAAQ;AAQd,UAAM,eAAeA,IAAAA,SAAS,MAAM;AAClC,YAAM,aAAa,MAAM,SAAS,QAAQ,UAAU;AACpD,UAAI,cAAc;AAElB,UAAI,MAAM,SAAS,SAAS,QAAQ,SAAS,MAAM;AACjD,sBAAc,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAAA,MACtD,WAAW,MAAM,SAAS,SAAS,QAAQ,MAAM;AAC/C,sBAAc,MAAM,SAAS,QAAQ,OAAO;AAAA,MAC9C;AAEA,aAAO,GAAG,WAAW,MAAM,UAAU,IAAI,eAAe,IAAI,UAAU,QAAQ;AAAA,IAChF,CAAC;AAGD,UAAM,eAAe,CAAC,aAAa;AAEjC,YAAM,SAAS,SAAS,QAAQ,IAAI,UAAQ,KAAK,KAAK,EAAE,OAAO,WAAS,KAAK,KAAK,CAAA;AAElF,UAAI,OAAO,SAAS,GAAG;AACrBC,eAAAA,QAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"PlaylistCard.vue.cjs","sources":["../../../../../../../src/modules/music/components/cards/PlaylistCard.vue"],"sourcesContent":["<!-- components/cards/PlaylistCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'playlist', params: { url: playlist.url } }\" \n class=\"playlist-card d-block radius-small o-hidden\"\n >\n <div class=\"playlist-cover pos-relative\">\n <Media \n :url=\"playlist.coverUrl || '/logo/logo-placeholder.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div v-if=\"playlist.tracks && playlist.tracks.length > 0\" class=\"playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop.prevent=\"playPlaylist(playlist)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"playlist-info pd-small bg-light\">\n <h3 class=\" t-medium mn-b-small t-truncate\">{{ playlist.title }}</h3>\n <p class=\"t-transp t-small t-truncate\">{{ playlistInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as playlistsState, actions as playlistsActions } from '../../store/playlists.js';\n\nconst props = defineProps({\n playlist: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst playlistInfo = computed(() => {\n const trackCount = props.playlist.tracks?.length || 0;\n let creatorName = 'Unknown';\n \n if (props.playlist.creator?.target?.profile?.name) {\n creatorName = props.playlist.creator.target.profile.name;\n } else if (props.playlist.creator?.target?.name) {\n creatorName = props.playlist.creator.target.name;\n }\n \n return `${creatorName} • ${trackCount} ${trackCount === 1 ? 'track' : 'tracks'}`;\n});\n\n// Methods\nconst playPlaylist = async (playlist) => {\n if (!playlist || !playlist.url) {\n console.warn('Playlist or URL not available');\n return;\n }\n \n try {\n console.log('Loading playlist:', playlist.url);\n \n // Fetch full playlist data with populated tracks\n await playlistsActions.fetchPlaylistByUrl(playlist.url);\n \n // Get tracks from store after loading\n const tracks = playlistsState.currentPlaylistTracks || [];\n \n console.log('Loaded tracks:', tracks);\n \n if (tracks.length > 0) {\n console.log('Setting queue with tracks:', tracks);\n playerActions.setQueue(tracks);\n } else {\n console.warn('No tracks found in playlist after loading');\n }\n } catch (error) {\n console.error('Error loading playlist for playback:', error);\n }\n};\n</script>\n\n<style scoped>\n.playlist-card {\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover {\n transform: translateY(-5px);\n}\n\n.playlist-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.playlist-card:hover .playlist-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["computed","playlistsActions","playlistsState","playerActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,eAAeA,IAAAA,SAAS,MAAM;AAClC,YAAM,aAAa,MAAM,SAAS,QAAQ,UAAU;AACpD,UAAI,cAAc;AAElB,UAAI,MAAM,SAAS,SAAS,QAAQ,SAAS,MAAM;AACjD,sBAAc,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAAA,MACtD,WAAW,MAAM,SAAS,SAAS,QAAQ,MAAM;AAC/C,sBAAc,MAAM,SAAS,QAAQ,OAAO;AAAA,MAC9C;AAEA,aAAO,GAAG,WAAW,MAAM,UAAU,IAAI,eAAe,IAAI,UAAU,QAAQ;AAAA,IAChF,CAAC;AAGD,UAAM,eAAe,OAAO,aAAa;AACvC,UAAI,CAAC,YAAY,CAAC,SAAS,KAAK;AAC9B,gBAAQ,KAAK,+BAA+B;AAC5C;AAAA,MACF;AAEA,UAAI;AACF,gBAAQ,IAAI,qBAAqB,SAAS,GAAG;AAG7C,cAAMC,kBAAiB,mBAAmB,SAAS,GAAG;AAGtD,cAAM,SAASC,gBAAe,yBAAyB,CAAA;AAEvD,gBAAQ,IAAI,kBAAkB,MAAM;AAEpC,YAAI,OAAO,SAAS,GAAG;AACrB,kBAAQ,IAAI,8BAA8B,MAAM;AAChDC,iBAAAA,QAAc,SAAS,MAAM;AAAA,QAC/B,OAAO;AACL,kBAAQ,KAAK,2CAA2C;AAAA,QAC1D;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,wCAAwC,KAAK;AAAA,MAC7D;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,15 +1,19 @@
1
- import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, withModifiers, toDisplayString } from "vue";
1
+ import { computed, resolveComponent, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, withModifiers, toDisplayString } from "vue";
2
2
  import Media from "../../../../components/Media/Media.vue.js";
3
3
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
4
  import _sfc_main$2 from "../../../icons/navigation/IconPlay.vue.js";
5
- import { actions } from "../../store/player.js";
5
+ import { actions as actions$1 } from "../../store/player.js";
6
+ import { actions, state } from "../../store/playlists.js";
6
7
  /* empty css */
7
8
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
8
9
  const _hoisted_1 = { class: "playlist-cover pos-relative" };
9
- const _hoisted_2 = { class: "playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out" };
10
- const _hoisted_3 = { class: "playlist-info pd-small bg-dark-transp-20" };
11
- const _hoisted_4 = { class: "t-medium t-truncate" };
12
- const _hoisted_5 = { class: "t-grey t-small t-truncate" };
10
+ const _hoisted_2 = {
11
+ key: 0,
12
+ class: "playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out"
13
+ };
14
+ const _hoisted_3 = { class: "playlist-info pd-small bg-light" };
15
+ const _hoisted_4 = { class: "t-medium mn-b-small t-truncate" };
16
+ const _hoisted_5 = { class: "t-transp t-small t-truncate" };
13
17
  const _sfc_main = {
14
18
  __name: "PlaylistCard",
15
19
  props: {
@@ -30,10 +34,24 @@ const _sfc_main = {
30
34
  }
31
35
  return `${creatorName} • ${trackCount} ${trackCount === 1 ? "track" : "tracks"}`;
32
36
  });
33
- const playPlaylist = (playlist) => {
34
- const tracks = playlist.tracks?.map((item) => item.track).filter((track) => track) || [];
35
- if (tracks.length > 0) {
36
- actions.setQueue(tracks);
37
+ const playPlaylist = async (playlist) => {
38
+ if (!playlist || !playlist.url) {
39
+ console.warn("Playlist or URL not available");
40
+ return;
41
+ }
42
+ try {
43
+ console.log("Loading playlist:", playlist.url);
44
+ await actions.fetchPlaylistByUrl(playlist.url);
45
+ const tracks = state.currentPlaylistTracks || [];
46
+ console.log("Loaded tracks:", tracks);
47
+ if (tracks.length > 0) {
48
+ console.log("Setting queue with tracks:", tracks);
49
+ actions$1.setQueue(tracks);
50
+ } else {
51
+ console.warn("No tracks found in playlist after loading");
52
+ }
53
+ } catch (error) {
54
+ console.error("Error loading playlist for playback:", error);
37
55
  }
38
56
  };
39
57
  return (_ctx, _cache) => {
@@ -45,12 +63,12 @@ const _sfc_main = {
45
63
  default: withCtx(() => [
46
64
  createElementVNode("div", _hoisted_1, [
47
65
  createVNode(Media, {
48
- url: __props.playlist.coverUrl || "/assets/placeholder-playlist.jpg",
66
+ url: __props.playlist.coverUrl || "/logo/logo-placeholder.jpg",
49
67
  class: "w-100 aspect-1x1 object-fit-cover"
50
68
  }, null, 8, ["url"]),
51
- createElementVNode("div", _hoisted_2, [
69
+ __props.playlist.tracks && __props.playlist.tracks.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
52
70
  createVNode(_sfc_main$1, {
53
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => playPlaylist(__props.playlist), ["stop"])),
71
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => playPlaylist(__props.playlist), ["stop", "prevent"])),
54
72
  class: "play-button bg-main radius-round flex-center flex aspect-1x1",
55
73
  showLoader: false,
56
74
  showSucces: false
@@ -63,7 +81,7 @@ const _sfc_main = {
63
81
  ]),
64
82
  _: 1
65
83
  })
66
- ])
84
+ ])) : createCommentVNode("", true)
67
85
  ]),
68
86
  createElementVNode("div", _hoisted_3, [
69
87
  createElementVNode("h3", _hoisted_4, toDisplayString(__props.playlist.title), 1),
@@ -75,7 +93,7 @@ const _sfc_main = {
75
93
  };
76
94
  }
77
95
  };
78
- const PlaylistCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-238f47e7"]]);
96
+ const PlaylistCard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-be2a71af"]]);
79
97
  export {
80
98
  PlaylistCard as default
81
99
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PlaylistCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/PlaylistCard.vue"],"sourcesContent":["<!-- components/cards/PlaylistCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'playlist', params: { url: playlist.url } }\" \n class=\"playlist-card d-block radius-small o-hidden\"\n >\n <div class=\"playlist-cover pos-relative\">\n <Media \n :url=\"playlist.coverUrl || '/assets/placeholder-playlist.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div class=\"playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop=\"playPlaylist(playlist)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"playlist-info pd-small bg-dark-transp-20\">\n <h3 class=\" t-medium t-truncate\">{{ playlist.title }}</h3>\n <p class=\"t-grey t-small t-truncate\">{{ playlistInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store\nimport { actions as playerActions } from '../../store/player.js';\n\nconst props = defineProps({\n playlist: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst playlistInfo = computed(() => {\n const trackCount = props.playlist.tracks?.length || 0;\n let creatorName = 'Unknown';\n \n if (props.playlist.creator?.target?.profile?.name) {\n creatorName = props.playlist.creator.target.profile.name;\n } else if (props.playlist.creator?.target?.name) {\n creatorName = props.playlist.creator.target.name;\n }\n \n return `${creatorName} • ${trackCount} ${trackCount === 1 ? 'track' : 'tracks'}`;\n});\n\n// Methods\nconst playPlaylist = (playlist) => {\n // Extract tracks from playlist\n const tracks = playlist.tracks?.map(item => item.track).filter(track => track) || [];\n \n if (tracks.length > 0) {\n playerActions.setQueue(tracks);\n }\n};\n</script>\n\n<style scoped>\n.playlist-card {\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover {\n transform: translateY(-5px);\n}\n\n.playlist-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.playlist-card:hover .playlist-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["playerActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsCA,UAAM,QAAQ;AAQd,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,aAAa,MAAM,SAAS,QAAQ,UAAU;AACpD,UAAI,cAAc;AAElB,UAAI,MAAM,SAAS,SAAS,QAAQ,SAAS,MAAM;AACjD,sBAAc,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAAA,MACtD,WAAW,MAAM,SAAS,SAAS,QAAQ,MAAM;AAC/C,sBAAc,MAAM,SAAS,QAAQ,OAAO;AAAA,MAC9C;AAEA,aAAO,GAAG,WAAW,MAAM,UAAU,IAAI,eAAe,IAAI,UAAU,QAAQ;AAAA,IAChF,CAAC;AAGD,UAAM,eAAe,CAAC,aAAa;AAEjC,YAAM,SAAS,SAAS,QAAQ,IAAI,UAAQ,KAAK,KAAK,EAAE,OAAO,WAAS,KAAK,KAAK,CAAA;AAElF,UAAI,OAAO,SAAS,GAAG;AACrBA,gBAAc,SAAS,MAAM;AAAA,MAC/B;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"PlaylistCard.vue.js","sources":["../../../../../../../src/modules/music/components/cards/PlaylistCard.vue"],"sourcesContent":["<!-- components/cards/PlaylistCard.vue -->\n<template>\n <router-link \n :to=\"{ name: 'playlist', params: { url: playlist.url } }\" \n class=\"playlist-card d-block radius-small o-hidden\"\n >\n <div class=\"playlist-cover pos-relative\">\n <Media \n :url=\"playlist.coverUrl || '/logo/logo-placeholder.jpg'\" \n class=\"w-100 aspect-1x1 object-fit-cover\"\n />\n <div v-if=\"playlist.tracks && playlist.tracks.length > 0\" class=\"playlist-overlay pos-absolute pos-t-0 pos-l-0 w-100 h-100 flex-center flex transition-cubic-in-out\">\n <Button \n @click.stop.prevent=\"playPlaylist(playlist)\" \n class=\"play-button bg-main radius-round flex-center flex aspect-1x1\"\n :showLoader=\"false\"\n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\" />\n </Button>\n </div>\n </div>\n <div class=\"playlist-info pd-small bg-light\">\n <h3 class=\" t-medium mn-b-small t-truncate\">{{ playlist.title }}</h3>\n <p class=\"t-transp t-small t-truncate\">{{ playlistInfo }}</p>\n </div>\n </router-link>\n</template>\n\n<script setup>\nimport { computed } from 'vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\n\n// Import player store\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as playlistsState, actions as playlistsActions } from '../../store/playlists.js';\n\nconst props = defineProps({\n playlist: {\n type: Object,\n required: true\n }\n});\n\n// Computed properties\nconst playlistInfo = computed(() => {\n const trackCount = props.playlist.tracks?.length || 0;\n let creatorName = 'Unknown';\n \n if (props.playlist.creator?.target?.profile?.name) {\n creatorName = props.playlist.creator.target.profile.name;\n } else if (props.playlist.creator?.target?.name) {\n creatorName = props.playlist.creator.target.name;\n }\n \n return `${creatorName} • ${trackCount} ${trackCount === 1 ? 'track' : 'tracks'}`;\n});\n\n// Methods\nconst playPlaylist = async (playlist) => {\n if (!playlist || !playlist.url) {\n console.warn('Playlist or URL not available');\n return;\n }\n \n try {\n console.log('Loading playlist:', playlist.url);\n \n // Fetch full playlist data with populated tracks\n await playlistsActions.fetchPlaylistByUrl(playlist.url);\n \n // Get tracks from store after loading\n const tracks = playlistsState.currentPlaylistTracks || [];\n \n console.log('Loaded tracks:', tracks);\n \n if (tracks.length > 0) {\n console.log('Setting queue with tracks:', tracks);\n playerActions.setQueue(tracks);\n } else {\n console.warn('No tracks found in playlist after loading');\n }\n } catch (error) {\n console.error('Error loading playlist for playback:', error);\n }\n};\n</script>\n\n<style scoped>\n.playlist-card {\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover {\n transform: translateY(-5px);\n}\n\n.playlist-overlay {\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.playlist-card:hover .playlist-overlay {\n opacity: 1;\n}\n\n.play-button {\n width: 48px;\n height: 48px;\n transform: scale(0.8);\n transition: transform 0.3s ease;\n}\n\n.playlist-card:hover .play-button {\n transform: scale(1);\n}\n</style>"],"names":["playlistsActions","playlistsState","playerActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,UAAM,QAAQ;AAQd,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,aAAa,MAAM,SAAS,QAAQ,UAAU;AACpD,UAAI,cAAc;AAElB,UAAI,MAAM,SAAS,SAAS,QAAQ,SAAS,MAAM;AACjD,sBAAc,MAAM,SAAS,QAAQ,OAAO,QAAQ;AAAA,MACtD,WAAW,MAAM,SAAS,SAAS,QAAQ,MAAM;AAC/C,sBAAc,MAAM,SAAS,QAAQ,OAAO;AAAA,MAC9C;AAEA,aAAO,GAAG,WAAW,MAAM,UAAU,IAAI,eAAe,IAAI,UAAU,QAAQ;AAAA,IAChF,CAAC;AAGD,UAAM,eAAe,OAAO,aAAa;AACvC,UAAI,CAAC,YAAY,CAAC,SAAS,KAAK;AAC9B,gBAAQ,KAAK,+BAA+B;AAC5C;AAAA,MACF;AAEA,UAAI;AACF,gBAAQ,IAAI,qBAAqB,SAAS,GAAG;AAG7C,cAAMA,QAAiB,mBAAmB,SAAS,GAAG;AAGtD,cAAM,SAASC,MAAe,yBAAyB,CAAA;AAEvD,gBAAQ,IAAI,kBAAkB,MAAM;AAEpC,YAAI,OAAO,SAAS,GAAG;AACrB,kBAAQ,IAAI,8BAA8B,MAAM;AAChDC,oBAAc,SAAS,MAAM;AAAA,QAC/B,OAAO;AACL,kBAAQ,KAAK,2CAA2C;AAAA,QAC1D;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,wCAAwC,KAAK;AAAA,MAC7D;AAAA,IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}