@ozdao/martyrs 0.2.492 → 0.2.493

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 (340) 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 +52 -45
  6. package/dist/builder.js +53 -46
  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.ssr.client.js +40 -40
  281. package/src/components/Calendar/Calendar.vue +378 -377
  282. package/src/components/Feed/Feed.vue +28 -2
  283. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  284. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  285. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  286. package/src/modules/music/README.md +8 -0
  287. package/src/modules/music/components/SidebarMusic.vue +6 -9
  288. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  289. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  290. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  291. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  292. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  293. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  294. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  295. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  296. package/src/modules/music/components/pages/Album.vue +373 -186
  297. package/src/modules/music/components/pages/Artist.vue +54 -94
  298. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  299. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  300. package/src/modules/music/components/pages/Playlist.vue +495 -379
  301. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  302. package/src/modules/music/components/pages/Track.vue +363 -69
  303. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  304. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  305. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  306. package/src/modules/music/controllers/search.controller.js +3 -0
  307. package/src/modules/music/controllers/stream.controller.js +11 -3
  308. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  309. package/src/modules/music/music.client.js +3 -6
  310. package/src/modules/music/music.server.js +8 -4
  311. package/src/modules/music/router/music.js +8 -1
  312. package/src/modules/music/routes/albums.routes.js +37 -5
  313. package/src/modules/music/routes/artists.routes.js +14 -4
  314. package/src/modules/music/routes/genres.routes.js +5 -1
  315. package/src/modules/music/routes/playlists.routes.js +42 -9
  316. package/src/modules/music/routes/tracks.routes.js +27 -2
  317. package/src/modules/music/store/artists.js +6 -2
  318. package/src/modules/music/store/player.js +6 -0
  319. package/src/modules/music/store/tracks.js +31 -0
  320. package/src/modules/music/websocket/streaming.handler.js +7 -1
  321. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  322. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  323. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  324. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  325. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  326. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  327. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  328. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  329. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  331. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  335. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  339. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  340. package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
@@ -1 +1 @@
1
- {"version":3,"file":"Album.vue.js","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page\">\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <div v-else-if=\"!album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-grey t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <div v-else>\n <!-- Album Header -->\n <div class=\"album-header mn-b-medium flex flex-v-center gap-medium\">\n <div class=\"album-cover\">\n <Media \n :url=\"album.coverUrl || '/assets/placeholder-album.jpg'\" \n class=\"w-15r h-15r object-fit-cover shadow-lg radius-small\"\n />\n </div>\n \n <div class=\"album-info\">\n <div class=\"t-small t-uppercase \">Album</div>\n <h1 class=\"\">{{ album.title }}</h1>\n \n <div class=\"album-meta mn-t-small flex flex-v-center\">\n <router-link \n v-if=\"album.artist && album.artist._id\"\n :to=\"{ name: 'artist', params: { url: album.artist.url } }\"\n class=\" t-medium hover-t-main\"\n >\n {{ getArtistName(album) }}\n </router-link>\n <span v-else class=\" t-medium\">{{ getArtistName(album) }}</span>\n \n <span class=\"t-grey mn-l-small mn-r-small\">•</span>\n \n <span class=\"t-grey\">{{ formatReleaseYear(album.releaseDate) }}</span>\n \n <span class=\"t-grey mn-l-small mn-r-small\">•</span>\n \n <span class=\"t-grey\">{{ albumTracks.length }} {{ albumTracks.length === 1 ? 'song' : 'songs' }}</span>\n </div>\n </div>\n </div>\n \n <!-- Album Actions -->\n <div class=\"album-actions mn-b-medium flex flex-v-center gap-small\">\n <Button \n @click=\"playAlbum\"\n class=\"play-button bg-main radius-round pd-small flex-v-center flex gap-small hover-scale-1\"\n :showLoader=\"false\" \n :showSucces=\"false\"\n >\n <IconPlay class=\"i-small\" fill=\"rgb(var(--black))\"/>\n <span class=\"t-black t-medium\">Play</span>\n </Button>\n \n <Button \n @click=\"toggleFavorite\"\n class=\"bg-transparent border-none pd-zero\"\n :showLoader=\"false\" \n :showSucces=\"false\"\n >\n <IconLike class=\"i-medium\" :fill=\"isFavorite ? 'rgb(var(--main))' : 'rgb(var(--white))'\"/>\n </Button>\n \n <Dropdown class=\"pos-relative\">\n <Button \n @click=\"showDropdown = !showDropdown\"\n class=\"bg-transparent border-none pd-zero\"\n :showLoader=\"false\" \n :showSucces=\"false\"\n >\n <IconEllipsis class=\"i-medium\" fill=\"rgb(var(--white))\"/>\n </Button>\n \n <template #content>\n <ul v-if=\"showDropdown\" class=\"pd-small bg-dark radius-small pos-absolute pos-t-100 pos-r-0 z-index-3 w-max-15r mn-t-thin\">\n <li class=\"mn-b-thin\">\n <Button \n @click=\"addToQueue\"\n class=\"bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small\"\n :showLoader=\"false\" \n :showSucces=\"false\"\n >\n <span>Add to Queue</span>\n </Button>\n </li>\n <li>\n <Button \n @click=\"copyLink\"\n class=\"bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small\"\n :showLoader=\"false\" \n :showSucces=\"false\"\n >\n <span>Copy Link</span>\n </Button>\n </li>\n </ul>\n </template>\n </Dropdown>\n </div>\n \n <!-- Album Tracks -->\n <div class=\"album-tracks\">\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium bg-dark-transp-10 radius-medium'\n }\n }\"\n class=\"gap-thin\"\n >\n <template #default=\"{ items }\">\n <TrackCard\n v-for=\"track in items\"\n :key=\"track._id\"\n :track=\"track\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n class=\"w-100 bg-dark-transp-10 radius-medium\"\n />\n </template>\n </Feed>\n </div>\n \n <!-- Album Info -->\n <div v-if=\"album.description\" class=\"album-description mn-t-medium pd-medium bg-dark-transp-10 radius-medium\">\n <h3 class=\" mn-b-small\">About</h3>\n <p class=\"t-grey\">{{ album.description }}</p>\n </div>\n \n <!-- More from this artist if available -->\n <div v-if=\"moreFromArtist.length > 0\" class=\"more-from-artist mn-t-medium\">\n <div class=\"flex-between flex mn-b-small\">\n <h2 class=\"\">More by {{ getArtistName(album) }}</h2>\n <router-link \n v-if=\"album.artist && album.artist._id\"\n :to=\"{ name: 'artist', params: { url: album.artist.url } }\" \n class=\"t-main t-small hover-opacity\"\n >\n See all\n </router-link>\n </div>\n \n <div class=\"albums-grid cols-5 mobile:cols-2 gap-small\">\n <div v-for=\"relatedAlbum in moreFromArtist\" :key=\"relatedAlbum._id\">\n <AlbumCard :album=\"relatedAlbum\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\nimport TrackCard from '../cards/TrackCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\n\n// Import icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\n\n// Import store modules\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// State\nconst isLoading = ref(true);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst moreFromArtist = ref([]);\n\n// Computed properties\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks);\n\n// Methods\nconst getArtistName = (albumItem) => {\n if (!albumItem) return 'Unknown Artist';\n \n if (albumItem.artist) {\n if (typeof albumItem.artist === 'object') {\n return albumItem.artist.name || 'Unknown Artist';\n }\n return albumItem.artist;\n }\n return 'Unknown Artist';\n};\n\nconst formatReleaseYear = (dateString) => {\n if (!dateString) return '';\n return new Date(dateString).getFullYear();\n};\n\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // Implement favorite album logic here\n};\n\nconst addToQueue = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n // Add all tracks to queue\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n \n showDropdown.value = false;\n }\n};\n\nconst copyLink = () => {\n const url = window.location.href;\n navigator.clipboard.writeText(url).then(() => {\n // Could show a success notification here\n showDropdown.value = false;\n });\n};\n\nconst fetchAlbumData = async () => {\n isLoading.value = true;\n \n try {\n // Fetch album data\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // If artist is available, fetch more albums from the same artist\n if (album.value?.artist?._id) {\n const artistAlbums = await albumsActions.fetchAlbums({\n artist: album.value.artist._id,\n status: 'published',\n isPublic: true,\n limit: 5\n });\n \n // Filter out the current album\n moreFromArtist.value = artistAlbums.filter(a => a._id !== album.value._id);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n } finally {\n isLoading.value = false;\n }\n};\n\n// Fetch data when component mounts or URL changes\nonMounted(fetchAlbumData);\n\nwatch(() => route.params.url, (newUrl) => {\n if (newUrl) {\n fetchAlbumData();\n }\n});\n</script>\n\n<style scoped>\n.album-cover {\n box-shadow: 0 4px 60px rgba(0, 0, 0, 0.5);\n}\n</style>"],"names":["albumsState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyLA,UAAM,QAAQ,SAAQ;AACP,cAAS;AAGxB,UAAM,YAAY,IAAI,IAAI;AAC1B,UAAM,aAAa,IAAI,KAAK;AAC5B,UAAM,eAAe,IAAI,KAAK;AAC9B,UAAM,iBAAiB,IAAI,EAAE;AAG7B,UAAM,QAAQ,SAAS,MAAMA,MAAY,YAAY;AACrD,UAAM,cAAc,SAAS,MAAMA,MAAY,kBAAkB;AAGjE,UAAM,gBAAgB,CAAC,cAAc;AACnC,UAAI,CAAC,UAAW,QAAO;AAEvB,UAAI,UAAU,QAAQ;AACpB,YAAI,OAAO,UAAU,WAAW,UAAU;AACxC,iBAAO,UAAU,OAAO,QAAQ;AAAA,QAClC;AACA,eAAO,UAAU;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,CAAC,eAAe;AACxC,UAAI,CAAC,WAAY,QAAO;AACxB,aAAO,IAAI,KAAK,UAAU,EAAE,YAAW;AAAA,IACzC;AAEA,UAAM,YAAY,MAAM;AACtB,UAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AACrDC,kBAAc,SAAS,YAAY,KAAK;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM;AAC3B,iBAAW,QAAQ,CAAC,WAAW;AAAA,IAEjC;AAEA,UAAM,aAAa,MAAM;AACvB,UAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AAErD,oBAAY,MAAM,QAAQ,WAAS;AACjCA,oBAAc,WAAW,KAAK;AAAA,QAChC,CAAC;AAED,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM;AACrB,YAAM,MAAM,OAAO,SAAS;AAC5B,gBAAU,UAAU,UAAU,GAAG,EAAE,KAAK,MAAM;AAE5C,qBAAa,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,YAAY;AACjC,gBAAU,QAAQ;AAElB,UAAI;AAEF,cAAMC,QAAc,gBAAgB,MAAM,OAAO,GAAG;AAGpD,YAAI,MAAM,OAAO,QAAQ,KAAK;AAC5B,gBAAM,eAAe,MAAMA,QAAc,YAAY;AAAA,YACnD,QAAQ,MAAM,MAAM,OAAO;AAAA,YAC3B,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,UACf,CAAO;AAGD,yBAAe,QAAQ,aAAa,OAAO,OAAK,EAAE,QAAQ,MAAM,MAAM,GAAG;AAAA,QAC3E;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AAAA,MACnD,UAAC;AACC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAGA,cAAU,cAAc;AAExB,UAAM,MAAM,MAAM,OAAO,KAAK,CAAC,WAAW;AACxC,UAAI,QAAQ;AACV,uBAAc;AAAA,MAChB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Album.vue.js","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page pd-small\">\n <!-- Loading -->\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <!-- Not Found -->\n <div v-if=\"hasLoaded && !album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-transp t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <!-- Album Content -->\n <div v-if=\"album\" class=\"album-content cols-2-fit-content mobile:cols-1 gap-big\">\n <!-- Left Column - Cover & Stats -->\n <div class=\"pos-sticky pos-t-0 mobile:pos-relative album-cover-section\">\n <!-- Cover -->\n <div class=\"cover-container relative mn-b-medium radius-big overflow-hidden shadow-big\">\n <Media \n :url=\"album.coverArt || '/logo/logo-placeholder.jpg'\"\n :alt=\"album.title\"\n class=\"aspect-1x1 w-100 radius-medium o-hidden\"\n />\n </div>\n\n <!-- Quick Stats -->\n <div class=\"stats-grid grid cols-2 gap-small\">\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ album.totalTracks || 0 }}</div>\n <div class=\"t-small t-transp t-uppercase\">Tracks</div>\n </div>\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ formatNumber(album.views) }}</div>\n <div class=\"t-small t-transp t-uppercase\">Views</div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Album Details -->\n <div class=\"album-details-section\">\n <!-- Album Type Badge -->\n <div class=\"flex items-center gap-small mn-b-small\">\n <span class=\"badge bg-primary-transp-20 t-primary pd-thin-big radius-small t-small t-uppercase\">\n {{ album.type }}\n </span>\n <span v-if=\"album.status === 'published'\" class=\"badge bg-success-transp-20 t-success pd-thin-big radius-small t-small\">\n Published\n </span>\n </div>\n\n <!-- Album Title -->\n <h1 class=\"h1 mn-b-medium\">{{ album.title }}</h1>\n\n <!-- Action Buttons -->\n <div class=\"flex gap-small mn-b-medium\">\n <Button\n @click=\"playAlbum\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 flex-center gap-thin\"\n >\n <IconPlay class=\"w-1r h-1r\" />\n Play All\n </Button>\n \n <Button\n @click=\"toggleFavorite\"\n :color=\"isFavorite ? 'danger' : 'transp'\"\n size=\"medium\"\n class=\"w-3r h-3r radius-full\"\n >\n <IconLike class=\"w-1-25r h-1-25r\" :fill=\"isFavorite\" />\n </Button>\n \n <Button\n @click=\"shufflePlay\"\n color=\"transp\"\n size=\"medium\"\n class=\"w-3r h-3r radius-full\"\n >\n <IconShuffle class=\"w-1-25r h-1-25r\" />\n </Button>\n \n <Dropdown v-model=\"showDropdown\" class=\"relative\">\n <template #trigger>\n <Button color=\"transp\" size=\"medium\" class=\"w-3r h-3r radius-full\">\n <IconEllipsis class=\"w-1-25r h-1-25r\" />\n </Button>\n </template>\n <template #default>\n <div class=\"dropdown-menu bg-dark pd-small radius-medium shadow-big mn-t-thin\">\n <Button @click=\"addToQueue\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Queue\n </Button>\n <Button @click=\"copyLink\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Copy Link\n </Button>\n <template v-if=\"isOwner\">\n <hr class=\"mn-v-thin border-dark-transp-10\" />\n <Button @click=\"editAlbum\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Edit Album\n </Button>\n <Button @click=\"deleteAlbum\" color=\"danger\" size=\"small\" class=\"w-100 justify-start\">\n Delete Album\n </Button>\n </template>\n </div>\n </template>\n </Dropdown>\n </div>\n\n <!-- Artists Cards -->\n <div class=\"artists-section mn-b-big\">\n <h3 class=\"t-medium mn-b-small\" v-if=\"album.artists && album.artists.length > 1\">Artists</h3>\n <div class=\"flex flex-col gap-small\">\n <div \n v-for=\"artist in album.artists\" \n :key=\"artist._id\"\n class=\"artist-card bg-light pd-medium radius-medium flex items-center gap-medium\"\n >\n <router-link \n :to=\"`/artist/${artist.url}`\"\n class=\"flex items-center gap-medium flex-1 hover-opacity\"\n >\n <div class=\"artist-avatar\">\n <Media \n v-if=\"artist.photoUrl\"\n :url=\"artist.photoUrl\"\n :alt=\"artist.name\"\n class=\"w-4r h-4r radius-full object-cover\"\n />\n <div v-else class=\"w-4r h-4r radius-full bg-primary flex-center \">\n {{ artist.name.charAt(0) }}\n </div>\n </div>\n <div>\n <div class=\"flex items-center gap-thin\">\n <span class=\"t-large \">{{ artist.name }}</span>\n <IconVerified v-if=\"artist.isVerified\" class=\"w-1r h-1r t-primary\" />\n </div>\n <span class=\"t-small t-transp\">Artist</span>\n </div>\n </router-link>\n <Button \n v-if=\"!isOwner\"\n @click=\"() => toggleFollowArtist(artist._id)\"\n :color=\"followedArtists.includes(artist._id) ? 'primary' : 'transp'\"\n size=\"small\"\n >\n {{ followedArtists.includes(artist._id) ? 'Following' : 'Follow' }}\n </Button>\n </div>\n </div>\n </div>\n\n <!-- Metadata Cards -->\n <div class=\"metadata-grid grid cols-2 gap-small mn-b-big\">\n <!-- Release Date -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <div class=\"icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center\">\n <IconCalendar class=\"w-1-5r h-1-5r t-primary\" />\n </div>\n <div>\n <div class=\"t-small t-transp t-uppercase\">Released</div>\n <div class=\"t-medium \">{{ formatDate(album.releaseDate) }}</div>\n </div>\n </div>\n\n <!-- Total Duration -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <div class=\"icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center\">\n <IconClock class=\"w-1-5r h-1-5r t-primary\" />\n </div>\n <div>\n <div class=\"t-small t-transp t-uppercase\">Duration</div>\n <div class=\"t-medium \">{{ totalDuration }}</div>\n </div>\n </div>\n\n <!-- Label -->\n <div v-if=\"album.label\" class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <div class=\"icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center\">\n <IconDisc class=\"w-1-5r h-1-5r t-primary\" />\n </div>\n <div>\n <div class=\"t-small t-transp t-uppercase\">Label</div>\n <div class=\"t-medium \">{{ album.label }}</div>\n </div>\n </div>\n\n <!-- Visibility -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <div class=\"icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center\">\n <IconEye class=\"w-1-5r h-1-5r t-primary\" />\n </div>\n <div>\n <div class=\"t-small t-transp t-uppercase\">Visibility</div>\n <div class=\"t-medium \">{{ album.isPublic ? 'Public' : 'Private' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Genres & Tags -->\n <div v-if=\"(album.genres && album.genres.length) || (album.tags && album.tags.length)\" class=\"tags-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">Genres & Tags</h3>\n <div class=\"flex gap-thin flex-wrap\">\n <span \n v-for=\"genre in album.genres\" \n :key=\"genre\"\n class=\"tag bg-primary-transp-20 t-primary pd-thin-big radius-small t-small hover-bg-primary-transp-30 cursor-pointer\"\n >\n {{ genre }}\n </span>\n <span \n v-for=\"tag in album.tags\" \n :key=\"tag\"\n class=\"tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer\"\n >\n #{{ tag }}\n </span>\n </div>\n </div>\n\n <!-- Description -->\n <div v-if=\"album.description\" class=\"description-section bg-light pd-medium radius-medium mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">About</h3>\n <p class=\"t-transp\">{{ album.description }}</p>\n </div>\n </div>\n </div>\n\n <!-- Album Tracks -->\n <section v-if=\"!isLoading && album && albumTracks.length\" class=\"tracks-section mn-t-big\">\n <h2 class=\"h2 mn-b-medium\">Tracklist</h2>\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium t-center'\n }\n }\"\n >\n <template #default=\"{ items }\">\n <div class=\"bg-light radius-medium o-hidden\">\n <TrackListCard\n v-for=\"(track, index) in items\"\n :key=\"track._id\"\n :track=\"track\"\n :index=\"index + 1\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n />\n </div>\n </template>\n </Feed>\n </section>\n\n <!-- More from Artists -->\n <section v-if=\"!isLoading && album && moreAlbums.length\" class=\"more-albums-section mn-t-big\">\n <div class=\"flex justify-between items-center mn-b-medium\">\n <h2 class=\"h2\">More Albums</h2>\n <router-link \n v-if=\"album.artists && album.artists[0]\"\n :to=\"`/artist/${album.artists[0].url}`\" \n class=\"t-primary hover-opacity\"\n >\n See all\n </router-link>\n </div>\n <div class=\"flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide\"\n >\n <li v-for=\"relatedAlbum in moreAlbums\" :key=\"album._id\" class=\"flex-none scroll-snap-align-start\">\n <AlbumCard :album=\"relatedAlbum\" class=\"w-min-15r transition-cubic-in-out\" />\n </li>\n </div>\n </section>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\n\n// Icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\nimport IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';\nimport IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';\nimport IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';\nimport IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';\nimport IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n// Components\nimport TrackListCard from '../cards/TrackListCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\n\n// Store\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Emits\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\n// State\nconst hasLoaded = ref(false);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst followedArtists = ref([]);\nconst moreAlbums = ref([]);\n\n// Clear state\nalbumsState.currentAlbum = null;\nalbumsState.currentAlbumTracks = [];\n\n// Computed\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks || []);\n\nconst isOwner = computed(() => {\n return album.value?.owner?.target === authState.user?._id;\n});\n\nconst totalDuration = computed(() => {\n if (!albumTracks.value.length) return '0:00';\n const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);\n return formatDuration(totalSeconds);\n});\n\n// Format helpers\nconst formatDate = (dateString) => {\n if (!dateString) return 'Unknown';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n};\n\nconst formatDuration = (seconds) => {\n if (!seconds) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n \n if (h > 0) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return `${m}:${s.toString().padStart(2, '0')}`;\n};\n\nconst formatNumber = (num) => {\n if (!num) return '0';\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + 'M';\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + 'K';\n }\n return num.toString();\n};\n\n// Actions\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst shufflePlay = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);\n playerActions.setQueue(shuffled);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // TODO: Implement actual saving\n};\n\nconst toggleFollowArtist = (artistId) => {\n const index = followedArtists.value.indexOf(artistId);\n if (index > -1) {\n followedArtists.value.splice(index, 1);\n } else {\n followedArtists.value.push(artistId);\n }\n // TODO: Implement actual following\n};\n\nconst addToQueue = () => {\n if (albumTracks.value.length > 0) {\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n showDropdown.value = false;\n }\n};\n\nconst editAlbum = () => {\n router.push({ name: 'album-edit', params: { url: album.value.url } });\n};\n\nconst deleteAlbum = async () => {\n if (confirm('Are you sure you want to delete this album?')) {\n try {\n await albumsActions.deleteAlbum(album.value._id);\n router.push({ name: 'music-library' });\n } catch (error) {\n console.error('Failed to delete album:', error);\n }\n }\n};\n\nconst copyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n showDropdown.value = false;\n};\n\n// Data fetching\nconst fetchAlbumData = async () => {\n try {\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // Fetch more albums from the same artists\n if (album.value?.artists?.length) {\n const artistIds = album.value.artists.map(a => a._id);\n const albums = await albumsActions.fetchAlbums({\n artist: { $in: artistIds },\n status: 'published',\n isPublic: true,\n limit: 6\n });\n \n // Filter out current album\n moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n }\n};\n\n// Lifecycle\nonMounted(async () => {\n emits('page-loading');\n \n await fetchAlbumData();\n \n hasLoaded.value = true;\n emits('page-loaded');\n});\n</script>\n\n<style scoped>\n</style>"],"names":["albumsState","authState","playerActions","albumsActions"],"mappings":"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"}
@@ -3,20 +3,18 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
- const Loader = require("../../../../components/Loader/Loader.vue2.cjs");
6
+ ;/* empty css */
7
+ const TrackListCard = require("../cards/TrackListCard.vue.cjs");
7
8
  const artists = require("../../store/artists.cjs");
8
9
  const auth = require("../../../auth/views/store/auth.cjs");
9
10
  const globals = require("../../../globals/views/store/globals.cjs");
10
11
  const mixins = require("../../../globals/views/mixins/mixins.cjs");
11
- const _hoisted_1 = {
12
- key: 0,
13
- class: "flex-center flex pd-extra"
14
- };
12
+ const _hoisted_1 = { class: "w-100 pos-relative" };
15
13
  const _hoisted_2 = {
16
- key: 1,
14
+ key: 0,
17
15
  class: "flex-center flex-column flex pd-extra"
18
16
  };
19
- const _hoisted_3 = { key: 2 };
17
+ const _hoisted_3 = { key: 1 };
20
18
  const _hoisted_4 = {
21
19
  key: 0,
22
20
  class: "pos-absolute pos-t-medium pos-r-medium z-index-1"
@@ -94,29 +92,36 @@ const _hoisted_44 = { class: "p-medium t-truncate" };
94
92
  const _hoisted_45 = { class: "p-small t-transp" };
95
93
  const _hoisted_46 = {
96
94
  key: 2,
95
+ class: "bg-light pd-medium radius-medium mn-b-medium"
96
+ };
97
+ const _hoisted_47 = { class: "bg-white radius-medium o-hidden" };
98
+ const _hoisted_48 = {
99
+ key: 3,
97
100
  class: "bg-light pd-medium radius-medium t-center"
98
101
  };
99
- const _hoisted_47 = {
102
+ const _hoisted_49 = {
100
103
  key: 0,
101
104
  class: "mn-t-medium"
102
105
  };
103
- const _hoisted_48 = { class: "cols-5 gap-medium mobile:cols-2" };
104
- const _hoisted_49 = ["onClick"];
105
- const _hoisted_50 = { class: "w-100 aspect-1x1 radius-medium o-hidden mn-b-small" };
106
- const _hoisted_51 = ["src"];
107
- const _hoisted_52 = {
106
+ const _hoisted_50 = { class: "cols-5 gap-medium mobile:cols-2" };
107
+ const _hoisted_51 = ["onClick"];
108
+ const _hoisted_52 = { class: "w-100 aspect-1x1 radius-medium o-hidden mn-b-small" };
109
+ const _hoisted_53 = ["src"];
110
+ const _hoisted_54 = {
108
111
  key: 1,
109
112
  class: "w-100 h-100 bg-light flex-center flex"
110
113
  };
111
- const _hoisted_53 = { class: "p-medium t-truncate" };
114
+ const _hoisted_55 = { class: "p-medium t-truncate" };
112
115
  const _sfc_main = {
113
116
  __name: "Artist",
114
- setup(__props) {
117
+ emits: ["page-loading", "page-loaded"],
118
+ setup(__props, { emit: __emit }) {
115
119
  const { formatDate } = mixins.useGlobalMixins();
116
120
  const router = vueRouter.useRouter();
117
121
  const route = vueRouter.useRoute();
118
- const isLoading = vue.ref(true);
122
+ const emits = __emit;
119
123
  const genres = vue.ref([]);
124
+ const hasLoaded = vue.ref(false);
120
125
  const artist = vue.computed(() => {
121
126
  return artists.state.currentArtist;
122
127
  });
@@ -126,102 +131,58 @@ const _sfc_main = {
126
131
  const relatedArtists = vue.computed(() => {
127
132
  return artists.state.relatedArtists;
128
133
  });
134
+ const artistTracks = vue.computed(() => {
135
+ return artists.state.discography.tracks || [];
136
+ });
129
137
  const isOwner = vue.computed(() => {
130
138
  if (!artist.value || !auth.state.user._id) return false;
131
139
  return artist.value.creator?.target?._id === auth.state.user._id;
132
140
  });
141
+ artists.state.currentArtist = null;
142
+ artists.state.discography = {
143
+ albums: [],
144
+ singles: [],
145
+ tracks: []
146
+ };
147
+ artists.state.relatedArtists = [];
133
148
  const fetchArtist = async () => {
134
- isLoading.value = true;
135
149
  try {
136
150
  const url = route.params.url;
137
151
  if (!url) {
138
152
  throw new Error("Artist URL is required");
139
153
  }
140
154
  await artists.actions.fetchArtistByUrl(url);
141
- if (artist.value?.genre && artist.value.genre.length > 0) {
142
- await fetchGenres();
143
- }
144
155
  } catch (error) {
145
156
  console.error("Error fetching artist:", error);
146
157
  globals.actions.setError({
147
158
  message: "Failed to load artist"
148
159
  });
149
- } finally {
150
- isLoading.value = false;
151
160
  }
152
161
  };
153
- const fetchGenres = async () => {
154
- };
155
- const editArtist = () => {
156
- router.push({
157
- name: "artist-edit",
158
- params: { url: artist.value.url }
159
- });
160
- };
161
- const manageContent = () => {
162
- router.push({
163
- name: "artist-manage-content",
164
- params: { artistId: artist.value._id }
165
- });
166
- };
167
- const navigateToAlbum = (album) => {
168
- router.push({
169
- name: "album",
170
- params: { url: album.url }
171
- });
172
- };
173
- const navigateToTrack = (track) => {
174
- router.push({
175
- name: "track",
176
- params: { url: track.url }
177
- });
178
- };
179
- const navigateToArtist = (artist2) => {
180
- router.push({
181
- name: "artist",
182
- params: { url: artist2.url }
183
- });
184
- };
185
- const viewAllAlbums = () => {
186
- router.push({
187
- name: "artist-albums",
188
- params: { artistId: artist.value._id }
189
- });
190
- };
191
- const viewAllSingles = () => {
192
- router.push({
193
- name: "artist-singles",
194
- params: { artistId: artist.value._id }
195
- });
196
- };
197
- const addRelease = () => {
198
- router.push({
199
- name: "release-create",
200
- query: { artistId: artist.value._id }
201
- });
202
- };
203
162
  vue.onMounted(async () => {
163
+ emits("page-loading");
204
164
  await fetchArtist();
165
+ hasLoaded.value = true;
166
+ emits("page-loaded");
205
167
  });
206
168
  return (_ctx, _cache) => {
207
- return vue.openBlock(), vue.createElementBlock("div", null, [
208
- isLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
209
- vue.createVNode(Loader.default)
210
- ])) : !artist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
211
- _cache[1] || (_cache[1] = vue.createElementVNode("h2", { class: "h2 mn-b-medium" }, "Artist Not Found", -1)),
212
- _cache[2] || (_cache[2] = vue.createElementVNode("p", { class: "p-medium t-transp mn-b-medium" }, "The artist you are looking for doesn't exist or may have been removed.", -1)),
169
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
170
+ hasLoaded.value && !artist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
171
+ _cache[6] || (_cache[6] = vue.createElementVNode("h2", { class: "h2 mn-b-medium" }, "Artist Not Found", -1)),
172
+ _cache[7] || (_cache[7] = vue.createElementVNode("p", { class: "p-medium t-transp mn-b-medium" }, "The artist you are looking for doesn't exist or may have been removed.", -1)),
213
173
  vue.createVNode(Button.default, {
214
174
  submit: () => vue.unref(router).push({ name: "music-home" }),
215
175
  class: "bg-main",
216
176
  showSucces: false,
217
177
  showLoader: false
218
178
  }, {
219
- default: vue.withCtx(() => _cache[0] || (_cache[0] = [
179
+ default: vue.withCtx(() => _cache[5] || (_cache[5] = [
220
180
  vue.createTextVNode(" Back to Music ")
221
181
  ])),
222
182
  _: 1
223
183
  }, 8, ["submit"])
224
- ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
184
+ ])) : vue.createCommentVNode("", true),
185
+ artist.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
225
186
  vue.createElementVNode("div", {
226
187
  class: "w-100 t-white h-50vh pos-relative",
227
188
  style: vue.normalizeStyle(artist.value.coverUrl ? `background-image: url(${_ctx.FILE_SERVER_URL + artist.value.coverUrl}); background-size: cover; background-position: center;` : "")
@@ -231,23 +192,23 @@ const _sfc_main = {
231
192
  }, null, 2),
232
193
  isOwner.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
233
194
  vue.createVNode(Button.default, {
234
- submit: editArtist,
195
+ onClick: _cache[0] || (_cache[0] = ($event) => vue.unref(router).push({ name: "artist-edit", params: { url: artist.value.url } })),
235
196
  class: "bg-main mn-r-small",
236
197
  showSucces: false,
237
198
  showLoader: false
238
199
  }, {
239
- default: vue.withCtx(() => _cache[3] || (_cache[3] = [
200
+ default: vue.withCtx(() => _cache[8] || (_cache[8] = [
240
201
  vue.createTextVNode(" Edit Artist ")
241
202
  ])),
242
203
  _: 1
243
204
  }),
244
205
  vue.createVNode(Button.default, {
245
- submit: manageContent,
206
+ onClick: _cache[1] || (_cache[1] = ($event) => vue.unref(router).push({ name: "artist-manage-content", params: { artistId: artist.value._id } })),
246
207
  class: "bg-white t-black",
247
208
  showSucces: false,
248
209
  showLoader: false
249
210
  }, {
250
- default: vue.withCtx(() => _cache[4] || (_cache[4] = [
211
+ default: vue.withCtx(() => _cache[9] || (_cache[9] = [
251
212
  vue.createTextVNode(" Manage Content ")
252
213
  ])),
253
214
  _: 1
@@ -261,7 +222,7 @@ const _sfc_main = {
261
222
  alt: "Artist photo",
262
223
  class: "w-100 h-100 object-fit-cover"
263
224
  }, null, 8, _hoisted_7)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_8, [
264
- vue.createElementVNode("span", _hoisted_9, vue.toDisplayString(artist.value.name[0]), 1)
225
+ vue.createElementVNode("span", _hoisted_9, vue.toDisplayString(artist.value?.name?.[0] || "A"), 1)
265
226
  ]))
266
227
  ]),
267
228
  vue.createElementVNode("div", _hoisted_10, [
@@ -276,7 +237,7 @@ const _sfc_main = {
276
237
  href: `https://t.me/${artist.value.socials.telegram}`,
277
238
  target: "_blank",
278
239
  class: "bg-white t-black flex-center flex w-2r h-2r radius-extra"
279
- }, _cache[5] || (_cache[5] = [
240
+ }, _cache[10] || (_cache[10] = [
280
241
  vue.createElementVNode("span", null, "T", -1)
281
242
  ]), 8, _hoisted_16)) : vue.createCommentVNode("", true),
282
243
  artist.value.socials.twitter ? (vue.openBlock(), vue.createElementBlock("a", {
@@ -284,7 +245,7 @@ const _sfc_main = {
284
245
  href: `https://twitter.com/${artist.value.socials.twitter}`,
285
246
  target: "_blank",
286
247
  class: "bg-white t-black flex-center flex w-2r h-2r radius-extra"
287
- }, _cache[6] || (_cache[6] = [
248
+ }, _cache[11] || (_cache[11] = [
288
249
  vue.createElementVNode("span", null, "𝕏", -1)
289
250
  ]), 8, _hoisted_17)) : vue.createCommentVNode("", true),
290
251
  artist.value.socials.instagram ? (vue.openBlock(), vue.createElementBlock("a", {
@@ -292,7 +253,7 @@ const _sfc_main = {
292
253
  href: `https://instagram.com/${artist.value.socials.instagram}`,
293
254
  target: "_blank",
294
255
  class: "bg-white t-black flex-center flex w-2r h-2r radius-extra"
295
- }, _cache[7] || (_cache[7] = [
256
+ }, _cache[12] || (_cache[12] = [
296
257
  vue.createElementVNode("span", null, "I", -1)
297
258
  ]), 8, _hoisted_18)) : vue.createCommentVNode("", true),
298
259
  artist.value.socials.facebook ? (vue.openBlock(), vue.createElementBlock("a", {
@@ -300,7 +261,7 @@ const _sfc_main = {
300
261
  href: `https://facebook.com/${artist.value.socials.facebook}`,
301
262
  target: "_blank",
302
263
  class: "bg-white t-black flex-center flex w-2r h-2r radius-extra"
303
- }, _cache[8] || (_cache[8] = [
264
+ }, _cache[13] || (_cache[13] = [
304
265
  vue.createElementVNode("span", null, "F", -1)
305
266
  ]), 8, _hoisted_19)) : vue.createCommentVNode("", true),
306
267
  artist.value.website ? (vue.openBlock(), vue.createElementBlock("a", {
@@ -308,7 +269,7 @@ const _sfc_main = {
308
269
  href: artist.value.website,
309
270
  target: "_blank",
310
271
  class: "bg-white t-black flex-center flex w-2r h-2r radius-extra"
311
- }, _cache[9] || (_cache[9] = [
272
+ }, _cache[14] || (_cache[14] = [
312
273
  vue.createElementVNode("span", null, "W", -1)
313
274
  ]), 8, _hoisted_20)) : vue.createCommentVNode("", true)
314
275
  ])
@@ -319,11 +280,11 @@ const _sfc_main = {
319
280
  vue.createElementVNode("div", _hoisted_22, [
320
281
  vue.createElementVNode("div", null, [
321
282
  vue.createElementVNode("div", _hoisted_23, [
322
- _cache[10] || (_cache[10] = vue.createElementVNode("h2", { class: "h3 mn-b-small" }, "Biography", -1)),
283
+ _cache[15] || (_cache[15] = vue.createElementVNode("h2", { class: "h3 mn-b-small" }, "Biography", -1)),
323
284
  artist.value.bio ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_24, vue.toDisplayString(artist.value.bio), 1)) : (vue.openBlock(), vue.createElementBlock("p", _hoisted_25, "No biography available for this artist."))
324
285
  ]),
325
286
  genres.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_26, [
326
- _cache[11] || (_cache[11] = vue.createElementVNode("h2", { class: "h3 mn-b-small" }, "Genres", -1)),
287
+ _cache[16] || (_cache[16] = vue.createElementVNode("h2", { class: "h3 mn-b-small" }, "Genres", -1)),
327
288
  vue.createElementVNode("div", _hoisted_27, [
328
289
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(genres.value, (genre) => {
329
290
  return vue.openBlock(), vue.createElementBlock("span", {
@@ -336,13 +297,13 @@ const _sfc_main = {
336
297
  ]),
337
298
  vue.createElementVNode("div", null, [
338
299
  discography.value.albums.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_28, [
339
- _cache[14] || (_cache[14] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Albums", -1)),
300
+ _cache[19] || (_cache[19] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Albums", -1)),
340
301
  vue.createElementVNode("div", _hoisted_29, [
341
302
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(discography.value.albums, (album) => {
342
303
  return vue.openBlock(), vue.createElementBlock("div", {
343
304
  key: album._id,
344
305
  class: "bg-white pd-small radius-medium flex-v-center flex cursor-pointer hover-bg-white",
345
- onClick: ($event) => navigateToAlbum(album)
306
+ onClick: ($event) => vue.unref(router).push({ name: "album", params: { url: album.url } })
346
307
  }, [
347
308
  vue.createElementVNode("div", _hoisted_31, [
348
309
  album.coverUrl ? (vue.openBlock(), vue.createElementBlock("img", {
@@ -350,7 +311,7 @@ const _sfc_main = {
350
311
  src: _ctx.FILE_SERVER_URL + album.coverUrl,
351
312
  alt: "Album cover",
352
313
  class: "w-100 h-100 object-fit-cover"
353
- }, null, 8, _hoisted_32)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_33, _cache[12] || (_cache[12] = [
314
+ }, null, 8, _hoisted_32)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_33, _cache[17] || (_cache[17] = [
354
315
  vue.createElementVNode("span", null, "A", -1)
355
316
  ])))
356
317
  ]),
@@ -363,25 +324,25 @@ const _sfc_main = {
363
324
  ]),
364
325
  discography.value.albums.length > 4 ? (vue.openBlock(), vue.createBlock(Button.default, {
365
326
  key: 0,
366
- submit: viewAllAlbums,
327
+ onClick: _cache[2] || (_cache[2] = ($event) => vue.unref(router).push({ name: "artist-albums", params: { artistId: artist.value._id } })),
367
328
  class: "mn-t-small w-100 bg-white t-black",
368
329
  showSucces: false,
369
330
  showLoader: false
370
331
  }, {
371
- default: vue.withCtx(() => _cache[13] || (_cache[13] = [
332
+ default: vue.withCtx(() => _cache[18] || (_cache[18] = [
372
333
  vue.createTextVNode(" View All Albums ")
373
334
  ])),
374
335
  _: 1
375
336
  })) : vue.createCommentVNode("", true)
376
337
  ])) : vue.createCommentVNode("", true),
377
338
  discography.value.singles.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_37, [
378
- _cache[17] || (_cache[17] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Singles & EPs", -1)),
339
+ _cache[22] || (_cache[22] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Singles & EPs", -1)),
379
340
  vue.createElementVNode("div", _hoisted_38, [
380
341
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(discography.value.singles, (single) => {
381
342
  return vue.openBlock(), vue.createElementBlock("div", {
382
343
  key: single._id,
383
344
  class: "bg-white pd-small radius-medium flex-v-center flex cursor-pointer hover-bg-white",
384
- onClick: ($event) => navigateToTrack(single)
345
+ onClick: ($event) => vue.unref(router).push({ name: "track", params: { url: single.url } })
385
346
  }, [
386
347
  vue.createElementVNode("div", _hoisted_40, [
387
348
  single.coverUrl ? (vue.openBlock(), vue.createElementBlock("img", {
@@ -389,7 +350,7 @@ const _sfc_main = {
389
350
  src: _ctx.FILE_SERVER_URL + single.coverUrl,
390
351
  alt: "Single cover",
391
352
  class: "w-100 h-100 object-fit-cover"
392
- }, null, 8, _hoisted_41)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_42, _cache[15] || (_cache[15] = [
353
+ }, null, 8, _hoisted_41)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_42, _cache[20] || (_cache[20] = [
393
354
  vue.createElementVNode("span", null, "S", -1)
394
355
  ])))
395
356
  ]),
@@ -402,28 +363,42 @@ const _sfc_main = {
402
363
  ]),
403
364
  discography.value.singles.length > 5 ? (vue.openBlock(), vue.createBlock(Button.default, {
404
365
  key: 0,
405
- submit: viewAllSingles,
366
+ onClick: _cache[3] || (_cache[3] = ($event) => vue.unref(router).push({ name: "artist-singles", params: { artistId: artist.value._id } })),
406
367
  class: "mn-t-small w-100 bg-white t-black",
407
368
  showSucces: false,
408
369
  showLoader: false
409
370
  }, {
410
- default: vue.withCtx(() => _cache[16] || (_cache[16] = [
371
+ default: vue.withCtx(() => _cache[21] || (_cache[21] = [
411
372
  vue.createTextVNode(" View All Singles & EPs ")
412
373
  ])),
413
374
  _: 1
414
375
  })) : vue.createCommentVNode("", true)
415
376
  ])) : vue.createCommentVNode("", true),
416
- discography.value.albums.length === 0 && discography.value.singles.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_46, [
417
- _cache[19] || (_cache[19] = vue.createElementVNode("p", { class: "p-medium mn-b-small" }, "No releases yet", -1)),
418
- _cache[20] || (_cache[20] = vue.createElementVNode("p", { class: "p-small t-transp" }, "This artist hasn't released any albums or singles yet.", -1)),
377
+ artistTracks.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_46, [
378
+ _cache[23] || (_cache[23] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Popular Tracks", -1)),
379
+ vue.createElementVNode("div", _hoisted_47, [
380
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(artistTracks.value, (track, index) => {
381
+ return vue.openBlock(), vue.createBlock(TrackListCard.default, {
382
+ key: track._id,
383
+ track,
384
+ index,
385
+ showAlbum: true,
386
+ showCover: true
387
+ }, null, 8, ["track", "index"]);
388
+ }), 128))
389
+ ])
390
+ ])) : vue.createCommentVNode("", true),
391
+ discography.value.albums.length === 0 && discography.value.singles.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_48, [
392
+ _cache[25] || (_cache[25] = vue.createElementVNode("p", { class: "p-medium mn-b-small" }, "No releases yet", -1)),
393
+ _cache[26] || (_cache[26] = vue.createElementVNode("p", { class: "p-small t-transp" }, "This artist hasn't released any albums or singles yet.", -1)),
419
394
  isOwner.value ? (vue.openBlock(), vue.createBlock(Button.default, {
420
395
  key: 0,
421
- submit: addRelease,
396
+ onClick: _cache[4] || (_cache[4] = ($event) => vue.unref(router).push({ name: "release-create", query: { artistId: artist.value._id } })),
422
397
  class: "mn-t-medium bg-main",
423
398
  showSucces: false,
424
399
  showLoader: false
425
400
  }, {
426
- default: vue.withCtx(() => _cache[18] || (_cache[18] = [
401
+ default: vue.withCtx(() => _cache[24] || (_cache[24] = [
427
402
  vue.createTextVNode(" Add Release ")
428
403
  ])),
429
404
  _: 1
@@ -431,32 +406,32 @@ const _sfc_main = {
431
406
  ])) : vue.createCommentVNode("", true)
432
407
  ])
433
408
  ]),
434
- relatedArtists.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_47, [
435
- _cache[21] || (_cache[21] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Fans Also Like", -1)),
436
- vue.createElementVNode("div", _hoisted_48, [
409
+ relatedArtists.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_49, [
410
+ _cache[27] || (_cache[27] = vue.createElementVNode("h2", { class: "h3 mn-b-medium" }, "Fans Also Like", -1)),
411
+ vue.createElementVNode("div", _hoisted_50, [
437
412
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(relatedArtists.value, (relatedArtist) => {
438
413
  return vue.openBlock(), vue.createElementBlock("div", {
439
414
  key: relatedArtist._id,
440
415
  class: "t-center cursor-pointer",
441
- onClick: ($event) => navigateToArtist(relatedArtist)
416
+ onClick: ($event) => vue.unref(router).push({ name: "artist", params: { url: relatedArtist.url } })
442
417
  }, [
443
- vue.createElementVNode("div", _hoisted_50, [
418
+ vue.createElementVNode("div", _hoisted_52, [
444
419
  relatedArtist.photoUrl ? (vue.openBlock(), vue.createElementBlock("img", {
445
420
  key: 0,
446
421
  src: _ctx.FILE_SERVER_URL + relatedArtist.photoUrl,
447
422
  alt: "Artist photo",
448
423
  class: "w-100 h-100 object-fit-cover"
449
- }, null, 8, _hoisted_51)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_52, [
450
- vue.createElementVNode("span", null, vue.toDisplayString(relatedArtist.name[0]), 1)
424
+ }, null, 8, _hoisted_53)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_54, [
425
+ vue.createElementVNode("span", null, vue.toDisplayString(relatedArtist?.name?.[0] || "A"), 1)
451
426
  ]))
452
427
  ]),
453
- vue.createElementVNode("p", _hoisted_53, vue.toDisplayString(relatedArtist.name), 1)
454
- ], 8, _hoisted_49);
428
+ vue.createElementVNode("p", _hoisted_55, vue.toDisplayString(relatedArtist.name), 1)
429
+ ], 8, _hoisted_51);
455
430
  }), 128))
456
431
  ])
457
432
  ])) : vue.createCommentVNode("", true)
458
433
  ])
459
- ]))
434
+ ])) : vue.createCommentVNode("", true)
460
435
  ]);
461
436
  };
462
437
  }