@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,287 +1,474 @@
1
1
  <!-- components/pages/Album.vue -->
2
2
  <template>
3
- <div class="album-page">
3
+ <div class="album-page pd-small">
4
+ <!-- Loading -->
4
5
  <div v-if="isLoading" class="w-100 h-25r flex-center flex">
5
6
  <Loader />
6
7
  </div>
7
8
 
8
- <div v-else-if="!album" class="t-center pd-big">
9
+ <!-- Not Found -->
10
+ <div v-if="hasLoaded && !album" class="t-center pd-big">
9
11
  <h2 class="">Album not found</h2>
10
- <p class="t-grey t-medium">The album you're looking for doesn't exist or has been removed.</p>
12
+ <p class="t-transp t-medium">The album you're looking for doesn't exist or has been removed.</p>
11
13
  </div>
12
14
 
13
- <div v-else>
14
- <!-- Album Header -->
15
- <div class="album-header mn-b-medium flex flex-v-center gap-medium">
16
- <div class="album-cover">
15
+ <!-- Album Content -->
16
+ <div v-if="album" class="album-content cols-2-fit-content mobile:cols-1 gap-big">
17
+ <!-- Left Column - Cover & Stats -->
18
+ <div class="pos-sticky pos-t-0 mobile:pos-relative album-cover-section">
19
+ <!-- Cover -->
20
+ <div class="cover-container relative mn-b-medium radius-big overflow-hidden shadow-big">
17
21
  <Media
18
- :url="album.coverUrl || '/assets/placeholder-album.jpg'"
19
- class="w-15r h-15r object-fit-cover shadow-lg radius-small"
22
+ :url="album.coverArt || '/logo/logo-placeholder.jpg'"
23
+ :alt="album.title"
24
+ class="aspect-1x1 w-100 radius-medium o-hidden"
20
25
  />
21
26
  </div>
22
-
23
- <div class="album-info">
24
- <div class="t-small t-uppercase ">Album</div>
25
- <h1 class="">{{ album.title }}</h1>
26
-
27
- <div class="album-meta mn-t-small flex flex-v-center">
28
- <router-link
29
- v-if="album.artist && album.artist._id"
30
- :to="{ name: 'artist', params: { url: album.artist.url } }"
31
- class=" t-medium hover-t-main"
32
- >
33
- {{ getArtistName(album) }}
34
- </router-link>
35
- <span v-else class=" t-medium">{{ getArtistName(album) }}</span>
36
-
37
- <span class="t-grey mn-l-small mn-r-small">•</span>
38
-
39
- <span class="t-grey">{{ formatReleaseYear(album.releaseDate) }}</span>
40
-
41
- <span class="t-grey mn-l-small mn-r-small">•</span>
42
-
43
- <span class="t-grey">{{ albumTracks.length }} {{ albumTracks.length === 1 ? 'song' : 'songs' }}</span>
27
+
28
+ <!-- Quick Stats -->
29
+ <div class="stats-grid grid cols-2 gap-small">
30
+ <div class="stat-card bg-light pd-medium radius-medium t-center">
31
+ <div class=" mn-b-thin">{{ album.totalTracks || 0 }}</div>
32
+ <div class="t-small t-transp t-uppercase">Tracks</div>
33
+ </div>
34
+ <div class="stat-card bg-light pd-medium radius-medium t-center">
35
+ <div class=" mn-b-thin">{{ formatNumber(album.views) }}</div>
36
+ <div class="t-small t-transp t-uppercase">Views</div>
44
37
  </div>
45
38
  </div>
46
39
  </div>
47
-
48
- <!-- Album Actions -->
49
- <div class="album-actions mn-b-medium flex flex-v-center gap-small">
50
- <Button
51
- @click="playAlbum"
52
- class="play-button bg-main radius-round pd-small flex-v-center flex gap-small hover-scale-1"
53
- :showLoader="false"
54
- :showSucces="false"
55
- >
56
- <IconPlay class="i-small" fill="rgb(var(--black))"/>
57
- <span class="t-black t-medium">Play</span>
58
- </Button>
59
-
60
- <Button
61
- @click="toggleFavorite"
62
- class="bg-transparent border-none pd-zero"
63
- :showLoader="false"
64
- :showSucces="false"
65
- >
66
- <IconLike class="i-medium" :fill="isFavorite ? 'rgb(var(--main))' : 'rgb(var(--white))'"/>
67
- </Button>
68
-
69
- <Dropdown class="pos-relative">
70
- <Button
71
- @click="showDropdown = !showDropdown"
72
- class="bg-transparent border-none pd-zero"
73
- :showLoader="false"
74
- :showSucces="false"
40
+
41
+ <!-- Right Column - Album Details -->
42
+ <div class="album-details-section">
43
+ <!-- Album Type Badge -->
44
+ <div class="flex items-center gap-small mn-b-small">
45
+ <span class="badge bg-primary-transp-20 t-primary pd-thin-big radius-small t-small t-uppercase">
46
+ {{ album.type }}
47
+ </span>
48
+ <span v-if="album.status === 'published'" class="badge bg-success-transp-20 t-success pd-thin-big radius-small t-small">
49
+ Published
50
+ </span>
51
+ </div>
52
+
53
+ <!-- Album Title -->
54
+ <h1 class="h1 mn-b-medium">{{ album.title }}</h1>
55
+
56
+ <!-- Action Buttons -->
57
+ <div class="flex gap-small mn-b-medium">
58
+ <Button
59
+ @click="playAlbum"
60
+ color="primary"
61
+ size="medium"
62
+ class="flex-1 flex-center gap-thin"
75
63
  >
76
- <IconEllipsis class="i-medium" fill="rgb(var(--white))"/>
64
+ <IconPlay class="w-1r h-1r" />
65
+ Play All
77
66
  </Button>
78
67
 
79
- <template #content>
80
- <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">
81
- <li class="mn-b-thin">
82
- <Button
83
- @click="addToQueue"
84
- class="bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small"
85
- :showLoader="false"
86
- :showSucces="false"
87
- >
88
- <span>Add to Queue</span>
68
+ <Button
69
+ @click="toggleFavorite"
70
+ :color="isFavorite ? 'danger' : 'transp'"
71
+ size="medium"
72
+ class="w-3r h-3r radius-full"
73
+ >
74
+ <IconLike class="w-1-25r h-1-25r" :fill="isFavorite" />
75
+ </Button>
76
+
77
+ <Button
78
+ @click="shufflePlay"
79
+ color="transp"
80
+ size="medium"
81
+ class="w-3r h-3r radius-full"
82
+ >
83
+ <IconShuffle class="w-1-25r h-1-25r" />
84
+ </Button>
85
+
86
+ <Dropdown v-model="showDropdown" class="relative">
87
+ <template #trigger>
88
+ <Button color="transp" size="medium" class="w-3r h-3r radius-full">
89
+ <IconEllipsis class="w-1-25r h-1-25r" />
90
+ </Button>
91
+ </template>
92
+ <template #default>
93
+ <div class="dropdown-menu bg-dark pd-small radius-medium shadow-big mn-t-thin">
94
+ <Button @click="addToQueue" color="transp" size="small" class="w-100 justify-start">
95
+ Add to Queue
89
96
  </Button>
90
- </li>
91
- <li>
92
- <Button
93
- @click="copyLink"
94
- class="bg-transparent border-none pd-thin w-100 t-left hover-bg-dark radius-small"
95
- :showLoader="false"
96
- :showSucces="false"
97
- >
98
- <span>Copy Link</span>
97
+ <Button @click="copyLink" color="transp" size="small" class="w-100 justify-start">
98
+ Copy Link
99
99
  </Button>
100
- </li>
101
- </ul>
102
- </template>
103
- </Dropdown>
100
+ <template v-if="isOwner">
101
+ <hr class="mn-v-thin border-dark-transp-10" />
102
+ <Button @click="editAlbum" color="transp" size="small" class="w-100 justify-start">
103
+ Edit Album
104
+ </Button>
105
+ <Button @click="deleteAlbum" color="danger" size="small" class="w-100 justify-start">
106
+ Delete Album
107
+ </Button>
108
+ </template>
109
+ </div>
110
+ </template>
111
+ </Dropdown>
112
+ </div>
113
+
114
+ <!-- Artists Cards -->
115
+ <div class="artists-section mn-b-big">
116
+ <h3 class="t-medium mn-b-small" v-if="album.artists && album.artists.length > 1">Artists</h3>
117
+ <div class="flex flex-col gap-small">
118
+ <div
119
+ v-for="artist in album.artists"
120
+ :key="artist._id"
121
+ class="artist-card bg-light pd-medium radius-medium flex items-center gap-medium"
122
+ >
123
+ <router-link
124
+ :to="`/artist/${artist.url}`"
125
+ class="flex items-center gap-medium flex-1 hover-opacity"
126
+ >
127
+ <div class="artist-avatar">
128
+ <Media
129
+ v-if="artist.photoUrl"
130
+ :url="artist.photoUrl"
131
+ :alt="artist.name"
132
+ class="w-4r h-4r radius-full object-cover"
133
+ />
134
+ <div v-else class="w-4r h-4r radius-full bg-primary flex-center ">
135
+ {{ artist.name.charAt(0) }}
136
+ </div>
137
+ </div>
138
+ <div>
139
+ <div class="flex items-center gap-thin">
140
+ <span class="t-large ">{{ artist.name }}</span>
141
+ <IconVerified v-if="artist.isVerified" class="w-1r h-1r t-primary" />
142
+ </div>
143
+ <span class="t-small t-transp">Artist</span>
144
+ </div>
145
+ </router-link>
146
+ <Button
147
+ v-if="!isOwner"
148
+ @click="() => toggleFollowArtist(artist._id)"
149
+ :color="followedArtists.includes(artist._id) ? 'primary' : 'transp'"
150
+ size="small"
151
+ >
152
+ {{ followedArtists.includes(artist._id) ? 'Following' : 'Follow' }}
153
+ </Button>
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <!-- Metadata Cards -->
159
+ <div class="metadata-grid grid cols-2 gap-small mn-b-big">
160
+ <!-- Release Date -->
161
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
162
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
163
+ <IconCalendar class="w-1-5r h-1-5r t-primary" />
164
+ </div>
165
+ <div>
166
+ <div class="t-small t-transp t-uppercase">Released</div>
167
+ <div class="t-medium ">{{ formatDate(album.releaseDate) }}</div>
168
+ </div>
169
+ </div>
170
+
171
+ <!-- Total Duration -->
172
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
173
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
174
+ <IconClock class="w-1-5r h-1-5r t-primary" />
175
+ </div>
176
+ <div>
177
+ <div class="t-small t-transp t-uppercase">Duration</div>
178
+ <div class="t-medium ">{{ totalDuration }}</div>
179
+ </div>
180
+ </div>
181
+
182
+ <!-- Label -->
183
+ <div v-if="album.label" class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
184
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
185
+ <IconDisc class="w-1-5r h-1-5r t-primary" />
186
+ </div>
187
+ <div>
188
+ <div class="t-small t-transp t-uppercase">Label</div>
189
+ <div class="t-medium ">{{ album.label }}</div>
190
+ </div>
191
+ </div>
192
+
193
+ <!-- Visibility -->
194
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
195
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
196
+ <IconEye class="w-1-5r h-1-5r t-primary" />
197
+ </div>
198
+ <div>
199
+ <div class="t-small t-transp t-uppercase">Visibility</div>
200
+ <div class="t-medium ">{{ album.isPublic ? 'Public' : 'Private' }}</div>
201
+ </div>
202
+ </div>
203
+ </div>
204
+
205
+ <!-- Genres & Tags -->
206
+ <div v-if="(album.genres && album.genres.length) || (album.tags && album.tags.length)" class="tags-section mn-b-medium">
207
+ <h3 class="t-medium mn-b-small">Genres & Tags</h3>
208
+ <div class="flex gap-thin flex-wrap">
209
+ <span
210
+ v-for="genre in album.genres"
211
+ :key="genre"
212
+ class="tag bg-primary-transp-20 t-primary pd-thin-big radius-small t-small hover-bg-primary-transp-30 cursor-pointer"
213
+ >
214
+ {{ genre }}
215
+ </span>
216
+ <span
217
+ v-for="tag in album.tags"
218
+ :key="tag"
219
+ class="tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer"
220
+ >
221
+ #{{ tag }}
222
+ </span>
223
+ </div>
224
+ </div>
225
+
226
+ <!-- Description -->
227
+ <div v-if="album.description" class="description-section bg-light pd-medium radius-medium mn-b-medium">
228
+ <h3 class="t-medium mn-b-small">About</h3>
229
+ <p class="t-transp">{{ album.description }}</p>
230
+ </div>
104
231
  </div>
105
-
106
- <!-- Album Tracks -->
107
- <div class="album-tracks">
108
- <Feed
109
- :store="{
110
- read: () => Promise.resolve(albumTracks),
111
- state: { isLoading: false }
112
- }"
113
- :external="true"
114
- :items="albumTracks"
115
- :states="{
116
- empty: {
117
- title: 'No tracks in album',
118
- description: 'This album appears to be empty',
119
- class: 'pd-medium bg-dark-transp-10 radius-medium'
120
- }
121
- }"
122
- class="gap-thin"
123
- >
124
- <template #default="{ items }">
125
- <TrackCard
126
- v-for="track in items"
232
+ </div>
233
+
234
+ <!-- Album Tracks -->
235
+ <section v-if="!isLoading && album && albumTracks.length" class="tracks-section mn-t-big">
236
+ <h2 class="h2 mn-b-medium">Tracklist</h2>
237
+ <Feed
238
+ :store="{
239
+ read: () => Promise.resolve(albumTracks),
240
+ state: { isLoading: false }
241
+ }"
242
+ :external="true"
243
+ :items="albumTracks"
244
+ :states="{
245
+ empty: {
246
+ title: 'No tracks in album',
247
+ description: 'This album appears to be empty',
248
+ class: 'pd-medium t-center'
249
+ }
250
+ }"
251
+ >
252
+ <template #default="{ items }">
253
+ <div class="bg-light radius-medium o-hidden">
254
+ <TrackListCard
255
+ v-for="(track, index) in items"
127
256
  :key="track._id"
128
257
  :track="track"
258
+ :index="index + 1"
129
259
  :showAlbum="false"
130
260
  :showCover="false"
131
- class="w-100 bg-dark-transp-10 radius-medium"
132
261
  />
133
- </template>
134
- </Feed>
135
- </div>
136
-
137
- <!-- Album Info -->
138
- <div v-if="album.description" class="album-description mn-t-medium pd-medium bg-dark-transp-10 radius-medium">
139
- <h3 class=" mn-b-small">About</h3>
140
- <p class="t-grey">{{ album.description }}</p>
141
- </div>
142
-
143
- <!-- More from this artist if available -->
144
- <div v-if="moreFromArtist.length > 0" class="more-from-artist mn-t-medium">
145
- <div class="flex-between flex mn-b-small">
146
- <h2 class="">More by {{ getArtistName(album) }}</h2>
147
- <router-link
148
- v-if="album.artist && album.artist._id"
149
- :to="{ name: 'artist', params: { url: album.artist.url } }"
150
- class="t-main t-small hover-opacity"
151
- >
152
- See all
153
- </router-link>
154
- </div>
155
-
156
- <div class="albums-grid cols-5 mobile:cols-2 gap-small">
157
- <div v-for="relatedAlbum in moreFromArtist" :key="relatedAlbum._id">
158
- <AlbumCard :album="relatedAlbum" />
159
262
  </div>
160
- </div>
263
+ </template>
264
+ </Feed>
265
+ </section>
266
+
267
+ <!-- More from Artists -->
268
+ <section v-if="!isLoading && album && moreAlbums.length" class="more-albums-section mn-t-big">
269
+ <div class="flex justify-between items-center mn-b-medium">
270
+ <h2 class="h2">More Albums</h2>
271
+ <router-link
272
+ v-if="album.artists && album.artists[0]"
273
+ :to="`/artist/${album.artists[0].url}`"
274
+ class="t-primary hover-opacity"
275
+ >
276
+ See all
277
+ </router-link>
161
278
  </div>
162
- </div>
279
+ <div class="flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide"
280
+ >
281
+ <li v-for="relatedAlbum in moreAlbums" :key="album._id" class="flex-none scroll-snap-align-start">
282
+ <AlbumCard :album="relatedAlbum" class="w-min-15r transition-cubic-in-out" />
283
+ </li>
284
+ </div>
285
+ </section>
163
286
  </div>
164
287
  </template>
165
288
 
166
289
  <script setup>
167
290
  import { ref, computed, onMounted, watch } from 'vue';
168
291
  import { useRoute, useRouter } from 'vue-router';
169
- import Feed from '@martyrs/src/components/Feed/Feed.vue';
170
- import TrackCard from '../cards/TrackCard.vue';
171
- import AlbumCard from '../cards/AlbumCard.vue';
172
292
  import Button from '@martyrs/src/components/Button/Button.vue';
173
293
  import Loader from '@martyrs/src/components/Loader/Loader.vue';
174
294
  import Media from '@martyrs/src/components/Media/Media.vue';
175
295
  import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';
296
+ import Feed from '@martyrs/src/components/Feed/Feed.vue';
176
297
 
177
- // Import icons
298
+ // Icons
178
299
  import IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';
179
300
  import IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';
180
301
  import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';
302
+ import IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';
303
+ import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';
304
+ import IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';
305
+ import IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';
306
+ import IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';
307
+ import IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';
308
+
309
+ // Components
310
+ import TrackListCard from '../cards/TrackListCard.vue';
311
+ import AlbumCard from '../cards/AlbumCard.vue';
181
312
 
182
- // Import store modules
313
+ // Store
183
314
  import { state as albumsState, actions as albumsActions } from '../../store/albums.js';
184
315
  import { actions as playerActions } from '../../store/player.js';
316
+ import { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';
185
317
 
186
318
  const route = useRoute();
187
319
  const router = useRouter();
188
320
 
321
+ // Emits
322
+ const emits = defineEmits(['page-loading', 'page-loaded']);
323
+
189
324
  // State
190
- const isLoading = ref(true);
325
+ const hasLoaded = ref(false);
191
326
  const isFavorite = ref(false);
192
327
  const showDropdown = ref(false);
193
- const moreFromArtist = ref([]);
328
+ const followedArtists = ref([]);
329
+ const moreAlbums = ref([]);
330
+
331
+ // Clear state
332
+ albumsState.currentAlbum = null;
333
+ albumsState.currentAlbumTracks = [];
194
334
 
195
- // Computed properties
335
+ // Computed
196
336
  const album = computed(() => albumsState.currentAlbum);
197
- const albumTracks = computed(() => albumsState.currentAlbumTracks);
337
+ const albumTracks = computed(() => albumsState.currentAlbumTracks || []);
338
+
339
+ const isOwner = computed(() => {
340
+ return album.value?.owner?.target === authState.user?._id;
341
+ });
342
+
343
+ const totalDuration = computed(() => {
344
+ if (!albumTracks.value.length) return '0:00';
345
+ const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);
346
+ return formatDuration(totalSeconds);
347
+ });
198
348
 
199
- // Methods
200
- const getArtistName = (albumItem) => {
201
- if (!albumItem) return 'Unknown Artist';
349
+ // Format helpers
350
+ const formatDate = (dateString) => {
351
+ if (!dateString) return 'Unknown';
352
+ return new Date(dateString).toLocaleDateString('en-US', {
353
+ year: 'numeric',
354
+ month: 'long',
355
+ day: 'numeric'
356
+ });
357
+ };
358
+
359
+ const formatDuration = (seconds) => {
360
+ if (!seconds) return '0:00';
361
+ const h = Math.floor(seconds / 3600);
362
+ const m = Math.floor((seconds % 3600) / 60);
363
+ const s = Math.floor(seconds % 60);
202
364
 
203
- if (albumItem.artist) {
204
- if (typeof albumItem.artist === 'object') {
205
- return albumItem.artist.name || 'Unknown Artist';
206
- }
207
- return albumItem.artist;
365
+ if (h > 0) {
366
+ return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
208
367
  }
209
- return 'Unknown Artist';
368
+ return `${m}:${s.toString().padStart(2, '0')}`;
210
369
  };
211
370
 
212
- const formatReleaseYear = (dateString) => {
213
- if (!dateString) return '';
214
- return new Date(dateString).getFullYear();
371
+ const formatNumber = (num) => {
372
+ if (!num) return '0';
373
+ if (num >= 1000000) {
374
+ return (num / 1000000).toFixed(1) + 'M';
375
+ } else if (num >= 1000) {
376
+ return (num / 1000).toFixed(1) + 'K';
377
+ }
378
+ return num.toString();
215
379
  };
216
380
 
381
+ // Actions
217
382
  const playAlbum = () => {
218
383
  if (albumTracks.value && albumTracks.value.length > 0) {
219
384
  playerActions.setQueue(albumTracks.value);
220
385
  }
221
386
  };
222
387
 
388
+ const shufflePlay = () => {
389
+ if (albumTracks.value && albumTracks.value.length > 0) {
390
+ const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);
391
+ playerActions.setQueue(shuffled);
392
+ }
393
+ };
394
+
223
395
  const toggleFavorite = () => {
224
396
  isFavorite.value = !isFavorite.value;
225
- // Implement favorite album logic here
397
+ // TODO: Implement actual saving
398
+ };
399
+
400
+ const toggleFollowArtist = (artistId) => {
401
+ const index = followedArtists.value.indexOf(artistId);
402
+ if (index > -1) {
403
+ followedArtists.value.splice(index, 1);
404
+ } else {
405
+ followedArtists.value.push(artistId);
406
+ }
407
+ // TODO: Implement actual following
226
408
  };
227
409
 
228
410
  const addToQueue = () => {
229
- if (albumTracks.value && albumTracks.value.length > 0) {
230
- // Add all tracks to queue
411
+ if (albumTracks.value.length > 0) {
231
412
  albumTracks.value.forEach(track => {
232
413
  playerActions.addToQueue(track);
233
414
  });
234
-
235
415
  showDropdown.value = false;
236
416
  }
237
417
  };
238
418
 
419
+ const editAlbum = () => {
420
+ router.push({ name: 'album-edit', params: { url: album.value.url } });
421
+ };
422
+
423
+ const deleteAlbum = async () => {
424
+ if (confirm('Are you sure you want to delete this album?')) {
425
+ try {
426
+ await albumsActions.deleteAlbum(album.value._id);
427
+ router.push({ name: 'music-library' });
428
+ } catch (error) {
429
+ console.error('Failed to delete album:', error);
430
+ }
431
+ }
432
+ };
433
+
239
434
  const copyLink = () => {
240
- const url = window.location.href;
241
- navigator.clipboard.writeText(url).then(() => {
242
- // Could show a success notification here
243
- showDropdown.value = false;
244
- });
435
+ navigator.clipboard.writeText(window.location.href);
436
+ showDropdown.value = false;
245
437
  };
246
438
 
439
+ // Data fetching
247
440
  const fetchAlbumData = async () => {
248
- isLoading.value = true;
249
-
250
441
  try {
251
- // Fetch album data
252
442
  await albumsActions.fetchAlbumByUrl(route.params.url);
253
443
 
254
- // If artist is available, fetch more albums from the same artist
255
- if (album.value?.artist?._id) {
256
- const artistAlbums = await albumsActions.fetchAlbums({
257
- artist: album.value.artist._id,
444
+ // Fetch more albums from the same artists
445
+ if (album.value?.artists?.length) {
446
+ const artistIds = album.value.artists.map(a => a._id);
447
+ const albums = await albumsActions.fetchAlbums({
448
+ artist: { $in: artistIds },
258
449
  status: 'published',
259
450
  isPublic: true,
260
- limit: 5
451
+ limit: 6
261
452
  });
262
453
 
263
- // Filter out the current album
264
- moreFromArtist.value = artistAlbums.filter(a => a._id !== album.value._id);
454
+ // Filter out current album
455
+ moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);
265
456
  }
266
457
  } catch (error) {
267
458
  console.error('Error fetching album data:', error);
268
- } finally {
269
- isLoading.value = false;
270
459
  }
271
460
  };
272
461
 
273
- // Fetch data when component mounts or URL changes
274
- onMounted(fetchAlbumData);
275
-
276
- watch(() => route.params.url, (newUrl) => {
277
- if (newUrl) {
278
- fetchAlbumData();
279
- }
462
+ // Lifecycle
463
+ onMounted(async () => {
464
+ emits('page-loading');
465
+
466
+ await fetchAlbumData();
467
+
468
+ hasLoaded.value = true;
469
+ emits('page-loaded');
280
470
  });
281
471
  </script>
282
472
 
283
473
  <style scoped>
284
- .album-cover {
285
- box-shadow: 0 4px 60px rgba(0, 0, 0, 0.5);
286
- }
287
474
  </style>