@ozdao/martyrs 0.2.492 → 0.2.494

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/builder.cjs +53 -90
  6. package/dist/builder.js +54 -91
  7. package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
  8. package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
  9. package/dist/globals.server.cjs +322 -3
  10. package/dist/globals.server.js +303 -1
  11. package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
  12. package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
  13. package/dist/inventory.server.cjs +2 -2
  14. package/dist/inventory.server.js +2 -2
  15. package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
  16. package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
  17. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
  18. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
  20. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
  22. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  25. package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  31. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  33. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  34. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
  38. package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  47. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  55. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  56. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  59. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  60. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  62. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  70. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  72. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
  77. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
  79. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
  81. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
  82. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
  83. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
  84. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
  85. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
  86. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
  87. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  88. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
  91. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
  96. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
  98. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
  104. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
  106. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
  108. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
  110. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
  117. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
  118. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
  120. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
  122. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
  124. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
  126. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
  128. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
  129. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
  130. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
  131. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
  132. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
  134. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
  136. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
  138. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
  140. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
  142. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
  144. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
  146. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
  148. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  149. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
  150. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
  152. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
  154. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
  156. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
  158. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
  160. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
  161. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
  162. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  163. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
  164. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
  165. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
  166. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
  167. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
  168. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
  169. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
  170. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  171. package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
  172. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/music/music.client.js +9 -12
  174. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  175. package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
  176. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/music/router/music.js +27 -1
  178. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  179. package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
  180. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/music/store/artists.js +6 -4
  182. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
  183. package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
  184. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/music/store/player.js +5 -0
  186. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  187. package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
  188. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
  189. package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
  190. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  191. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
  192. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  193. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  195. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  197. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  198. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
  199. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  201. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
  202. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  203. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  204. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  205. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  206. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  207. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  208. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  209. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  210. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  211. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  213. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  214. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  215. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  216. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  217. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  218. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  219. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  220. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  221. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  222. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  223. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  224. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  225. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  226. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  228. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  234. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
  235. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
  236. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
  237. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
  238. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
  239. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
  240. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
  241. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
  242. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
  243. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
  244. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
  245. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
  246. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
  247. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
  248. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
  249. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
  250. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  251. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  252. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
  253. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  254. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  255. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  256. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  257. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  258. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  259. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  260. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  261. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  262. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  263. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  264. package/dist/martyrs.cjs.js +1 -1
  265. package/dist/martyrs.css +1 -1
  266. package/dist/martyrs.es.js +1 -1
  267. package/dist/music.server.cjs +124 -31
  268. package/dist/music.server.js +124 -31
  269. package/dist/organizations.server.cjs +1 -1
  270. package/dist/organizations.server.js +1 -1
  271. package/dist/products.server.cjs +2 -2
  272. package/dist/products.server.js +2 -2
  273. package/dist/rents.server.cjs +3 -3
  274. package/dist/rents.server.js +3 -3
  275. package/dist/style.css +373 -80
  276. package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
  277. package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
  278. package/package.json +1 -1
  279. package/src/builder/modes/ssr.prod.js +21 -5
  280. package/src/builder/rspack/rspack.config.spa.client.js +0 -44
  281. package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
  282. package/src/components/Calendar/Calendar.vue +378 -377
  283. package/src/components/Feed/Feed.vue +28 -2
  284. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  285. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  286. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  287. package/src/modules/music/README.md +8 -0
  288. package/src/modules/music/components/SidebarMusic.vue +6 -9
  289. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  290. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  291. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  292. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  293. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  294. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  295. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  296. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  297. package/src/modules/music/components/pages/Album.vue +373 -186
  298. package/src/modules/music/components/pages/Artist.vue +54 -94
  299. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  300. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  301. package/src/modules/music/components/pages/Playlist.vue +495 -379
  302. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  303. package/src/modules/music/components/pages/Track.vue +363 -69
  304. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  305. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  306. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  307. package/src/modules/music/controllers/search.controller.js +3 -0
  308. package/src/modules/music/controllers/stream.controller.js +11 -3
  309. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  310. package/src/modules/music/music.client.js +3 -6
  311. package/src/modules/music/music.server.js +8 -4
  312. package/src/modules/music/router/music.js +8 -1
  313. package/src/modules/music/routes/albums.routes.js +37 -5
  314. package/src/modules/music/routes/artists.routes.js +14 -4
  315. package/src/modules/music/routes/genres.routes.js +5 -1
  316. package/src/modules/music/routes/playlists.routes.js +42 -9
  317. package/src/modules/music/routes/tracks.routes.js +27 -2
  318. package/src/modules/music/store/artists.js +6 -2
  319. package/src/modules/music/store/player.js +6 -0
  320. package/src/modules/music/store/tracks.js +31 -0
  321. package/src/modules/music/websocket/streaming.handler.js +7 -1
  322. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  323. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  324. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  325. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  326. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  327. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  328. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  329. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  331. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  335. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  339. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  340. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  341. package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
@@ -1,93 +1,227 @@
1
- <!-- components/forms/PlaylistForm.vue -->
2
1
  <template>
3
- <div class="playlist-form">
4
- <form @submit.prevent="submitForm">
5
- <div class="form-group mn-b-medium">
6
- <label for="title" class=" t-medium mn-b-thin d-block">Playlist Name</label>
7
- <Field
8
- v-model:field="form.title"
9
- id="title"
10
- type="text"
11
- placeholder="New Playlist"
12
- :validation="validationErrors.title"
13
- class="w-100 pd-small bg-dark-transp-25 radius-small "
2
+ <div class="pd-medium">
3
+ <h2 class="h2 mn-b-medium">{{ editMode ? 'Edit Playlist' : 'Create Playlist' }}</h2>
4
+
5
+ <form @submit.prevent="submitForm" class="cols-1 gap-medium">
6
+ <!-- Basic Info Section -->
7
+ <div class="bg-light pd-medium radius-medium">
8
+ <h3 class="h3 mn-b-medium">Basic Information</h3>
9
+
10
+ <!-- Playlist Cover -->
11
+ <div class="mn-b-medium">
12
+ <p class="p-semi mn-b-small">Playlist Cover</p>
13
+ <UploadImage
14
+ v-model:photo="playlist.coverUrl"
15
+ uploadPath="playlists/covers"
16
+ class="w-100 h-15r radius-small o-hidden mn-b-small"
17
+ @error="handleUploadError"
18
+ />
19
+ </div>
20
+
21
+ <!-- Title -->
22
+ <Field
23
+ v-model:field="playlist.title"
24
+ label="Title"
25
+ placeholder="Enter playlist title"
26
+ class="bg-white radius-small pd-small mn-b-thin"
27
+ :validation="validation.title"
14
28
  />
15
- </div>
16
-
17
- <div class="form-group mn-b-medium">
18
- <label for="description" class=" t-medium mn-b-thin d-block">Description</label>
19
- <Field
20
- v-model:field="form.description"
21
- id="description"
29
+
30
+ <!-- URL -->
31
+ <Field
32
+ v-model:field="playlist.url"
33
+ label="URL"
34
+ placeholder="Leave blank for auto-generation based on the playlist title"
35
+ class="bg-white radius-small pd-small mn-b-small"
36
+ />
37
+
38
+ <!-- Description -->
39
+ <Field
40
+ v-model:field="playlist.description"
41
+ label="Description"
22
42
  type="textarea"
23
- placeholder="Add an optional description"
24
- :validation="validationErrors.description"
25
- class="w-100 pd-small bg-dark-transp-25 radius-small "
43
+ placeholder="Enter playlist description"
44
+ class="bg-white radius-small pd-small mn-b-thin"
45
+ :validation="validation.description"
26
46
  />
27
47
  </div>
28
48
 
29
- <div class="form-group mn-b-medium">
30
- <label class=" t-medium mn-b-thin d-block">Privacy</label>
31
- <div class="flex gap-small">
32
- <Radio
33
- v-model:radio="form.isPublic"
34
- :value="true"
35
- name="privacy"
36
- label="Public"
37
- class=""
38
- />
39
- <Radio
40
- v-model:radio="form.isPublic"
41
- :value="false"
42
- name="privacy"
43
- label="Private"
44
- class=""
45
- />
49
+ <!-- Tracks Section -->
50
+ <Block title="Tracks">
51
+ <BlockMultiselect
52
+ v-model="playlist.tracks"
53
+ placeholder="Search tracks..."
54
+ :multiple="true"
55
+ :transform="(item) => ({
56
+ _id: item._id,
57
+ title: item.title,
58
+ artists: item.artists,
59
+ album: item.album,
60
+ duration: item.duration
61
+ })"
62
+ :store="{
63
+ read: (options) => tracksStore.actions.fetchTracks(options),
64
+ state: tracksStore.state
65
+ }"
66
+ :options="{
67
+ rootOnly: false,
68
+ excludeChildren: false,
69
+ limit: 50
70
+ }"
71
+ :skeleton="{
72
+ hide: false,
73
+ horizontal: true,
74
+ class: 'radius-small',
75
+ structure: [{
76
+ block: 'text', size: 'large'
77
+ }]
78
+ }"
79
+ :states="{
80
+ empty: {
81
+ title: 'No tracks found',
82
+ description: 'Try different search terms',
83
+ class: 'radius-small'
84
+ }
85
+ }"
86
+ key="_id"
87
+ :label="item => item.title"
88
+ classSearch="bg-white radius-small"
89
+ classSelected="bg-white pd-small radius-small"
90
+ classDropdown="bg-white pd-small radius-medium bs-small"
91
+ classItem="pd-small radius-small hover-bg-light cursor-pointer"
92
+ classFeed="h-max-30r gap-thin flex-column flex o-scroll"
93
+ >
94
+ <!-- Selected tracks with reorder support -->
95
+ <template #selected="{ item, clear, index }">
96
+ <div class="flex-nowrap flex-v-center flex gap-thin">
97
+ <button
98
+ v-if="playlist.tracks.length > 1"
99
+ @click.stop="moveTrack(index, 'up')"
100
+ :disabled="index === 0"
101
+ class="i-small pd-micro bg-grey-nano radius-extra flex-center flex aspect-1x1 hover-scale-1"
102
+ >
103
+ <IconArrowUp class="i-micro" />
104
+ </button>
105
+
106
+ <button
107
+ v-if="playlist.tracks.length > 1"
108
+ @click.stop="moveTrack(index, 'down')"
109
+ :disabled="index === playlist.tracks.length - 1"
110
+ class="i-small pd-micro bg-grey-nano radius-extra flex-center flex aspect-1x1 hover-scale-1"
111
+ >
112
+ <IconArrowDown class="i-micro" />
113
+ </button>
114
+
115
+ <div class="flex-1">
116
+ <p class="t-medium">{{ item.title }}</p>
117
+ <p class="t-small t-transp">
118
+ {{ item.artists?.map(a => a.name || a).join(', ') }}
119
+ <span v-if="item.album"> • {{ item.album.title || item.album }}</span>
120
+ </p>
121
+ </div>
122
+
123
+ <span v-if="item.duration" class="t-small t-transp">
124
+ {{ formatDuration(item.duration) }}
125
+ </span>
126
+
127
+ <button
128
+ @click.stop="clear"
129
+ class="i-small pd-micro bg-red radius-extra flex-center flex aspect-1x1 hover-scale-1"
130
+ >
131
+ <IconCross class="i-micro fill-white" />
132
+ </button>
133
+ </div>
134
+ </template>
135
+
136
+ <!-- Track items in dropdown -->
137
+ <template #item="{ item }">
138
+ <div class="flex-nowrap flex-v-center flex">
139
+ <div class="w-100">
140
+ <p class="t-medium">{{ item.title }}</p>
141
+ <p class="t-small t-transp">
142
+ {{ item.artists?.map(a => a.name || a).join(', ') }}
143
+ <span v-if="item.album"> • {{ item.album.title || item.album }}</span>
144
+ </p>
145
+ </div>
146
+ <span v-if="item.duration" class="t-small t-transp mn-l-small">
147
+ {{ formatDuration(item.duration) }}
148
+ </span>
149
+ </div>
150
+ </template>
151
+ </BlockMultiselect>
152
+
153
+ <!-- Tracks summary -->
154
+ <div v-if="playlist.tracks.length > 0" class="t-small t-transp mn-t-small">
155
+ {{ playlist.tracks.length }} tracks • {{ formatDuration(totalDuration) }}
46
156
  </div>
47
- </div>
157
+ </Block>
48
158
 
49
- <div class="form-group mn-b-medium">
50
- <label class=" t-medium mn-b-thin d-block">Cover Image</label>
51
- <div class="playlist-cover-upload flex gap-medium">
52
- <div class="playlist-cover-preview bg-dark-transp-25 radius-small o-hidden">
53
- <Media
54
- v-if="form.coverUrl"
55
- :url="form.coverUrl"
56
- class="w-10r h-10r object-fit-cover"
159
+ <!-- Privacy & Settings Section -->
160
+ <div class="bg-light pd-medium radius-medium">
161
+ <h3 class="h3 mn-b-medium">Privacy & Settings</h3>
162
+
163
+ <!-- Privacy -->
164
+ <div class="mn-b-medium">
165
+ <p class="p-semi mn-b-small">Privacy</p>
166
+ <div class="flex gap-medium">
167
+ <Radio
168
+ v-model:radio="playlist.isPublic"
169
+ :value="true"
170
+ name="privacy"
171
+ label="Public"
172
+ class="bg-white pd-small radius-small"
173
+ />
174
+ <Radio
175
+ v-model:radio="playlist.isPublic"
176
+ :value="false"
177
+ name="privacy"
178
+ label="Private"
179
+ class="bg-white pd-small radius-small"
180
+ />
181
+ </div>
182
+ </div>
183
+
184
+ <!-- Collaborative -->
185
+ <div class="mn-b-medium">
186
+ <p class="p-semi mn-b-small">Collaborative Playlist</p>
187
+ <div class="flex gap-medium">
188
+ <Radio
189
+ v-model:radio="playlist.isCollaborative"
190
+ :value="true"
191
+ name="collaborative"
192
+ label="Yes"
193
+ class="bg-white pd-small radius-small"
194
+ />
195
+ <Radio
196
+ v-model:radio="playlist.isCollaborative"
197
+ :value="false"
198
+ name="collaborative"
199
+ label="No"
200
+ class="bg-white pd-small radius-small"
57
201
  />
58
- <div v-else class="w-10r h-10r flex-center flex">
59
- <IconMusic class="i-big" fill="rgb(var(--grey))"/>
60
- </div>
61
202
  </div>
62
-
63
- <UploadImage
64
- v-model:photo="form.coverUrl"
65
- uploadPath="playlists"
66
- class="flex-1 h-10r bg-dark-transp-25 radius-small"
67
- />
68
203
  </div>
69
204
  </div>
70
205
 
71
- <div class="form-actions t-right">
72
- <Button
73
- @click="$emit('cancel')"
74
- type="button"
75
- class="bg-dark-transp-25 pd-small radius-small mn-r-small hover-bg-dark"
76
- :showLoader="false"
206
+ <!-- Submit Button -->
207
+ <div class="flex flex-justify-between">
208
+ <Button
209
+ @click="$router.go(-1)"
210
+ class="bg-grey-nano t-black"
77
211
  :showSucces="false"
212
+ :showLoader="false"
78
213
  >
79
214
  Cancel
80
215
  </Button>
81
216
 
82
- <Button
83
- type="submit"
84
- class="bg-main pd-small radius-small hover-scale-1"
217
+ <Button
85
218
  :submit="submitForm"
86
- :showLoader="true"
87
- :showSucces="true"
88
- :validation="!!Object.keys(validationErrors).length"
219
+ class="bg-main t-black"
220
+ :text="{
221
+ success: editMode ? 'Updated!' : 'Created!'
222
+ }"
89
223
  >
90
- Create Playlist
224
+ {{ editMode ? 'Update Playlist' : 'Create Playlist' }}
91
225
  </Button>
92
226
  </div>
93
227
  </form>
@@ -95,62 +229,238 @@
95
229
  </template>
96
230
 
97
231
  <script setup>
98
- import { ref, reactive } from 'vue';
232
+ import { ref, reactive, onMounted, watch, computed } from 'vue';
233
+ import { useRouter, useRoute } from 'vue-router';
234
+
235
+ // Import Martyrs components
99
236
  import Field from '@martyrs/src/components/Field/Field.vue';
100
- import Radio from '@martyrs/src/components/Radio/Radio.vue';
237
+ import Block from '@martyrs/src/components/Block/Block.vue';
101
238
  import Button from '@martyrs/src/components/Button/Button.vue';
239
+ import Radio from '@martyrs/src/components/Radio/Radio.vue';
102
240
  import UploadImage from '@martyrs/src/components/UploadImage/UploadImage.vue';
103
- import Media from '@martyrs/src/components/Media/Media.vue';
104
- import IconMusic from '@martyrs/src/modules/icons/entities/IconMusic.vue';
241
+ import IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';
242
+ import IconArrowUp from '@martyrs/src/modules/icons/navigation/IconCross.vue';
243
+ import IconArrowDown from '@martyrs/src/modules/icons/navigation/IconCross.vue';
244
+
245
+ import BlockMultiselect from '@martyrs/src/modules/globals/views/components/blocks/BlockMultiselect.vue';
105
246
 
106
- // Import auth store and playlists store
107
- import { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';
108
- import { actions as playlistsActions } from '../../store/playlists.js';
247
+ // Import stores
248
+ import * as playlistsStore from '../../store/playlists';
249
+ import * as tracksStore from '../../store/tracks';
250
+ import * as globals from '@martyrs/src/modules/globals/views/store/globals.js';
251
+ import * as auth from '@martyrs/src/modules/auth/views/store/auth.js';
252
+
253
+ // Props
254
+ const props = defineProps({
255
+ editMode: {
256
+ type: Boolean,
257
+ default: false
258
+ },
259
+ url: {
260
+ type: String,
261
+ default: ''
262
+ }
263
+ });
109
264
 
110
- const emit = defineEmits(['created', 'cancel']);
265
+ // Router and route
266
+ const router = useRouter();
267
+ const route = useRoute();
111
268
 
112
- // Form data
113
- const form = reactive({
269
+ // State
270
+ const playlist = reactive({
114
271
  title: '',
115
272
  description: '',
116
- isPublic: true,
117
273
  coverUrl: '',
118
- isCollaborative: false,
119
- tracks: []
274
+ tracks: [],
275
+ url: '',
276
+ isPublic: true,
277
+ isCollaborative: false
120
278
  });
121
279
 
122
- // Validation
123
- const validationErrors = reactive({});
280
+ const validation = reactive({
281
+ title: false,
282
+ description: false
283
+ });
124
284
 
125
- // Form submission
126
- const submitForm = async () => {
127
- // Validate form
128
- validationErrors.title = !form.title ? { message: 'Playlist name is required' } : null;
285
+ // Track if URL was manually entered
286
+ const urlManuallySet = ref(false);
287
+
288
+ // Function to generate URL-friendly slug from text
289
+ const generateSlug = (text) => {
290
+ if (!text) return '';
291
+ return text
292
+ .toLowerCase()
293
+ .replace(/[^a-z0-9\s-]/g, '') // Remove special characters
294
+ .replace(/\s+/g, '-') // Replace spaces with hyphens
295
+ .replace(/-+/g, '-') // Replace multiple hyphens with single
296
+ .trim('-'); // Remove leading/trailing hyphens
297
+ };
298
+
299
+ // Watch for changes in playlist title to auto-generate URL
300
+ watch(() => playlist.title, (newTitle) => {
301
+ // Only auto-generate if URL hasn't been manually set and we're not in edit mode
302
+ if (!urlManuallySet.value && !props.editMode) {
303
+ playlist.url = generateSlug(newTitle);
304
+ }
305
+ });
306
+
307
+ // Watch for manual changes to URL field
308
+ watch(() => playlist.url, (newUrl, oldUrl) => {
309
+ // If user manually changes URL, mark as manually set
310
+ if (newUrl !== generateSlug(playlist.title)) {
311
+ urlManuallySet.value = true;
312
+ }
313
+ });
314
+
315
+ // Computed
316
+ const totalDuration = computed(() => {
317
+ return playlist.tracks.reduce((sum, track) => sum + (track.duration || 0), 0);
318
+ });
319
+
320
+ // Methods
321
+ const formatDuration = (seconds) => {
322
+ if (!seconds) return '0:00';
323
+ const hours = Math.floor(seconds / 3600);
324
+ const minutes = Math.floor((seconds % 3600) / 60);
325
+ const secs = seconds % 60;
129
326
 
130
- // If there are validation errors, don't submit
131
- if (Object.values(validationErrors).some(error => error !== null)) {
132
- return;
327
+ if (hours > 0) {
328
+ return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
133
329
  }
330
+ return `${minutes}:${secs.toString().padStart(2, '0')}`;
331
+ };
332
+
333
+ const moveTrack = (index, direction) => {
334
+ const newIndex = direction === 'up' ? index - 1 : index + 1;
335
+ if (newIndex < 0 || newIndex >= playlist.tracks.length) return;
336
+
337
+ const tracks = [...playlist.tracks];
338
+ [tracks[index], tracks[newIndex]] = [tracks[newIndex], tracks[index]];
339
+ playlist.tracks = tracks;
340
+ };
341
+
342
+ const fetchPlaylist = async () => {
343
+ if (!props.url) return;
134
344
 
135
- // Prepare playlist data
136
- const playlistData = {
137
- ...form,
138
- creator: {
139
- type: 'User',
140
- target: authState.user._id
141
- },
142
- owner: {
143
- type: 'User',
144
- target: authState.user._id
345
+ try {
346
+ const fetchedPlaylist = await playlistsStore.actions.fetchPlaylistByUrl(props.url);
347
+
348
+ if (!fetchedPlaylist) {
349
+ globals.actions.setError({
350
+ message: 'Playlist not found'
351
+ });
352
+ return;
145
353
  }
146
- };
354
+
355
+ // Update local playlist data
356
+ Object.assign(playlist, {
357
+ title: fetchedPlaylist.title || '',
358
+ description: fetchedPlaylist.description || '',
359
+ coverUrl: fetchedPlaylist.coverUrl || '',
360
+ tracks: fetchedPlaylist.tracks || [],
361
+ url: fetchedPlaylist.url || '',
362
+ isPublic: fetchedPlaylist.isPublic !== false,
363
+ isCollaborative: fetchedPlaylist.isCollaborative || false,
364
+ _id: fetchedPlaylist._id
365
+ });
366
+
367
+ } catch (error) {
368
+ console.error('Error fetching playlist:', error);
369
+ globals.actions.setError({
370
+ message: 'Failed to load playlist details'
371
+ });
372
+ }
373
+ };
374
+
375
+ const validateForm = () => {
376
+ let isValid = true;
377
+
378
+ // Validate title
379
+ if (!playlist.title.trim()) {
380
+ validation.title = {
381
+ message: 'Playlist title is required'
382
+ };
383
+ isValid = false;
384
+ } else {
385
+ validation.title = false;
386
+ }
387
+
388
+ // Validate description
389
+ if (playlist.description && playlist.description.length > 2000) {
390
+ validation.description = {
391
+ message: 'Description is too long (max 2000 characters)'
392
+ };
393
+ isValid = false;
394
+ } else {
395
+ validation.description = false;
396
+ }
397
+
398
+ return isValid;
399
+ };
400
+
401
+ const submitForm = async () => {
402
+ if (!validateForm()) {
403
+ return;
404
+ }
147
405
 
148
406
  try {
149
- const playlist = await playlistsActions.createPlaylist(playlistData);
150
- emit('created', playlist);
407
+ // Prepare data for submission
408
+ const formData = {
409
+ ...playlist,
410
+ tracks: playlist.tracks.map(track => ({
411
+ track: track._id || track,
412
+ addedAt: new Date()
413
+ }))
414
+ };
415
+
416
+ // Add ownership data if creating new playlist
417
+ if (!props.editMode) {
418
+ formData.creator = {
419
+ type: 'user',
420
+ target: auth.state.user._id
421
+ };
422
+ formData.owner = {
423
+ type: 'user',
424
+ target: auth.state.user._id
425
+ };
426
+ }
427
+
428
+ let result;
429
+ if (props.editMode) {
430
+ result = await playlistsStore.actions.updatePlaylist(formData);
431
+ } else {
432
+ result = await playlistsStore.actions.createPlaylist(formData);
433
+ }
434
+
435
+ // Navigate to playlist detail page
436
+ setTimeout(() => {
437
+ router.push({
438
+ name: 'playlist',
439
+ params: { url: result.url }
440
+ });
441
+ }, 1000);
442
+
151
443
  } catch (error) {
152
- console.error('Error creating playlist:', error);
153
- // Handle error (could add form-level error message)
444
+ console.error('Error saving playlist:', error);
445
+ globals.actions.setError({
446
+ message: 'Failed to save playlist'
447
+ });
154
448
  }
155
449
  };
450
+
451
+ const handleUploadError = (error) => {
452
+ console.error('Upload error:', error);
453
+ globals.actions.setError({
454
+ message: 'Error uploading image'
455
+ });
456
+ };
457
+
458
+ // Lifecycle hooks
459
+ onMounted(async () => {
460
+ if (props.editMode) {
461
+ await fetchPlaylist();
462
+ // Mark URL as manually set in edit mode to prevent auto-generation
463
+ urlManuallySet.value = true;
464
+ }
465
+ });
156
466
  </script>
@@ -23,7 +23,7 @@
23
23
  </template>
24
24
 
25
25
  <script setup>
26
- import { ref, watchEffect, defineEmits } from 'vue';
26
+ import { ref, watch, onMounted, defineEmits } from 'vue';
27
27
  import Button from '@martyrs/src/components/Button/Button.vue';
28
28
  import IconSearch from '@martyrs/src/modules/icons/navigation/IconSearch.vue';
29
29
  import IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';
@@ -43,21 +43,44 @@ const emit = defineEmits(['search']);
43
43
 
44
44
  const searchInput = ref(null);
45
45
  const searchQuery = ref(props.initialQuery);
46
+ let searchTimeout = null;
46
47
 
47
48
  const handleSearch = () => {
48
- if (searchQuery.value.trim()) {
49
- emit('search', searchQuery.value.trim());
50
- }
49
+ emit('search', searchQuery.value.trim());
51
50
  };
52
51
 
53
52
  const clearSearch = () => {
54
53
  searchQuery.value = '';
55
- searchInput.value.focus();
54
+ emit('search', '');
55
+ searchInput.value?.focus();
56
56
  };
57
57
 
58
- watchEffect(() => {
59
- // Update search query when initialQuery prop changes
60
- if (props.initialQuery !== searchQuery.value) {
58
+ // Watch for changes in search query and emit search with debounce
59
+ watch(searchQuery, (newQuery) => {
60
+ // Clear previous timeout
61
+ if (searchTimeout) {
62
+ clearTimeout(searchTimeout);
63
+ }
64
+
65
+ if (newQuery.trim().length >= 2) {
66
+ // Set new timeout for debounce
67
+ searchTimeout = setTimeout(() => {
68
+ handleSearch();
69
+ }, 300);
70
+ } else if (newQuery.trim().length === 0) {
71
+ emit('search', '');
72
+ }
73
+ });
74
+
75
+ // Watch for changes in initialQuery prop
76
+ watch(() => props.initialQuery, (newQuery) => {
77
+ if (newQuery !== searchQuery.value) {
78
+ searchQuery.value = newQuery;
79
+ }
80
+ });
81
+
82
+ onMounted(() => {
83
+ if (props.initialQuery) {
61
84
  searchQuery.value = props.initialQuery;
62
85
  }
63
86
  });