@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.
- package/dist/_virtual/index.cjs +4 -4
- package/dist/_virtual/index.js +4 -4
- package/dist/_virtual/index2.cjs +4 -4
- package/dist/_virtual/index2.js +4 -4
- package/dist/builder.cjs +52 -45
- package/dist/builder.js +53 -46
- package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
- package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
- package/dist/globals.server.cjs +322 -3
- package/dist/globals.server.js +303 -1
- package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
- package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
- package/dist/inventory.server.cjs +2 -2
- package/dist/inventory.server.js +2 -2
- package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
- package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
- package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
- package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
- package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
- package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
- package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
- package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
- package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
- package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
- package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
- package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/music.client.js +9 -12
- package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
- package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +27 -1
- package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
- package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/artists.js +6 -4
- package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
- package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/player.js +5 -0
- package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
- package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
- package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
- package/dist/martyrs.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.cjs +124 -31
- package/dist/music.server.js +124 -31
- package/dist/organizations.server.cjs +1 -1
- package/dist/organizations.server.js +1 -1
- package/dist/products.server.cjs +2 -2
- package/dist/products.server.js +2 -2
- package/dist/rents.server.cjs +3 -3
- package/dist/rents.server.js +3 -3
- package/dist/style.css +373 -80
- package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
- package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
- package/package.json +1 -1
- package/src/builder/modes/ssr.prod.js +21 -5
- package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
- package/src/components/Calendar/Calendar.vue +378 -377
- package/src/components/Feed/Feed.vue +28 -2
- package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
- package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
- package/src/modules/globals/views/components/layouts/Client.vue +7 -0
- package/src/modules/music/README.md +8 -0
- package/src/modules/music/components/SidebarMusic.vue +6 -9
- package/src/modules/music/components/cards/AlbumCard.vue +20 -14
- package/src/modules/music/components/cards/ArtistCard.vue +1 -1
- package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
- package/src/modules/music/components/cards/TrackListCard.vue +24 -13
- package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
- package/src/modules/music/components/forms/SearchForm.vue +31 -8
- package/src/modules/music/components/forms/TrackForm.vue +50 -32
- package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
- package/src/modules/music/components/pages/Album.vue +373 -186
- package/src/modules/music/components/pages/Artist.vue +54 -94
- package/src/modules/music/components/pages/MusicHome.vue +59 -56
- package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
- package/src/modules/music/components/pages/Playlist.vue +495 -379
- package/src/modules/music/components/pages/SearchResults.vue +185 -313
- package/src/modules/music/components/pages/Track.vue +363 -69
- package/src/modules/music/components/player/MusicPlayer.vue +368 -97
- package/src/modules/music/components/player/TrackProgress.vue +76 -22
- package/src/modules/music/components/player/VolumeControl.vue +61 -28
- package/src/modules/music/controllers/search.controller.js +3 -0
- package/src/modules/music/controllers/stream.controller.js +11 -3
- package/src/modules/music/middlewares/playlists.verifier.js +1 -1
- package/src/modules/music/music.client.js +3 -6
- package/src/modules/music/music.server.js +8 -4
- package/src/modules/music/router/music.js +8 -1
- package/src/modules/music/routes/albums.routes.js +37 -5
- package/src/modules/music/routes/artists.routes.js +14 -4
- package/src/modules/music/routes/genres.routes.js +5 -1
- package/src/modules/music/routes/playlists.routes.js +42 -9
- package/src/modules/music/routes/tracks.routes.js +27 -2
- package/src/modules/music/store/artists.js +6 -2
- package/src/modules/music/store/player.js +6 -0
- package/src/modules/music/store/tracks.js +31 -0
- package/src/modules/music/websocket/streaming.handler.js +7 -1
- package/src/modules/rents/controllers/services/rents.services.js +2 -2
- package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
- package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
- package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
- package/src/modules/rents/views/components/pages/Rents.vue +60 -56
- package/dist/globals.websocket-DzvdIBf6.js +0 -306
- package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
- package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
- package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
- package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
- package/src/modules/music/components/cards/TrackCard.vue +0 -86
- 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
|
-
|
|
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-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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.
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
49
|
-
<div class="album-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class="
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
</
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
<
|
|
64
|
+
<IconPlay class="w-1r h-1r" />
|
|
65
|
+
Play All
|
|
77
66
|
</Button>
|
|
78
67
|
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
</
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
325
|
+
const hasLoaded = ref(false);
|
|
191
326
|
const isFavorite = ref(false);
|
|
192
327
|
const showDropdown = ref(false);
|
|
193
|
-
const
|
|
328
|
+
const followedArtists = ref([]);
|
|
329
|
+
const moreAlbums = ref([]);
|
|
330
|
+
|
|
331
|
+
// Clear state
|
|
332
|
+
albumsState.currentAlbum = null;
|
|
333
|
+
albumsState.currentAlbumTracks = [];
|
|
194
334
|
|
|
195
|
-
// Computed
|
|
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
|
-
//
|
|
200
|
-
const
|
|
201
|
-
if (!
|
|
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 (
|
|
204
|
-
|
|
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
|
|
368
|
+
return `${m}:${s.toString().padStart(2, '0')}`;
|
|
210
369
|
};
|
|
211
370
|
|
|
212
|
-
const
|
|
213
|
-
if (!
|
|
214
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
241
|
-
|
|
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
|
-
//
|
|
255
|
-
if (album.value?.
|
|
256
|
-
const
|
|
257
|
-
|
|
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:
|
|
451
|
+
limit: 6
|
|
261
452
|
});
|
|
262
453
|
|
|
263
|
-
// Filter out
|
|
264
|
-
|
|
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
|
-
//
|
|
274
|
-
onMounted(
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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>
|