@ozdao/martyrs 0.2.470 → 0.2.472
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/{Media-CR0V1zvB.js → Media-DW8RLbfM.js} +1 -1
- package/dist/{Media-C4Ges_Sd.mjs → Media-y_TX6us_.mjs} +1 -1
- package/dist/_virtual/index.cjs +1 -1
- package/dist/_virtual/index.js +1 -1
- package/dist/auth.server.js +1 -1
- package/dist/auth.server.mjs +1 -1
- package/dist/chats.server.js +1 -1
- package/dist/chats.server.mjs +1 -1
- package/dist/community.server.js +1 -1
- package/dist/community.server.mjs +1 -1
- package/dist/events.server.js +1 -1
- package/dist/events.server.mjs +1 -1
- package/dist/files.server.js +1 -1
- package/dist/files.server.mjs +1 -1
- package/dist/gallery.server.js +1 -1
- package/dist/gallery.server.mjs +1 -1
- package/dist/{index-DQqZReAr.js → index-CVXl1rB5.js} +0 -1
- package/dist/{index-DICZTQ-1.mjs → index-Df8vtZx7.mjs} +0 -1
- package/dist/{main-CsZAG5Wz.js → main-CCfQH-Dd.js} +2 -2
- package/dist/{main-CTcal9qN.mjs → main-CgmHzhq5.mjs} +74 -74
- package/dist/{node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_ → martyrs}/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.cjs +1 -1
- package/dist/martyrs/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.cjs.map +1 -0
- package/dist/{node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_ → martyrs}/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js +1 -1
- package/dist/martyrs/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +1 -0
- package/dist/martyrs/node_modules/@vue/shared/dist/shared.esm-bundler.cjs.map +1 -0
- package/dist/martyrs/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.cjs +5 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.cjs.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js +5 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js.map +1 -0
- package/dist/{node_modules/.pnpm/uuid@11.1.0 → martyrs}/node_modules/uuid/dist/esm-browser/rng.cjs +4 -4
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.cjs.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js +15 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.cjs +17 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.cjs.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js +17 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.cjs +13 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.cjs.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js +13 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.cjs +8 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.cjs.map +1 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js +8 -0
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +2 -2
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +2 -2
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +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/Skeleton/Skeleton.vue.cjs +5 -5
- package/dist/martyrs/src/components/Skeleton/Skeleton.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Skeleton/Skeleton.vue.js +5 -5
- package/dist/martyrs/src/components/Skeleton/Skeleton.vue.js.map +1 -1
- package/dist/martyrs/src/components/Tab/{Tab.vue2.cjs → Tab.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Tab/{Tab.vue2.js.map → Tab.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tree/Tree.vue.cjs +3 -1
- package/dist/martyrs/src/components/Tree/Tree.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Tree/Tree.vue.js +3 -1
- package/dist/martyrs/src/components/Tree/Tree.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.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 +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.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/store/auth.cjs +1 -0
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -0
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.cjs +1 -1
- package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.store.cjs +107 -21
- package/dist/martyrs/src/modules/globals/views/classes/globals.store.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/classes/globals.store.js +107 -21
- package/dist/martyrs/src/modules/globals/views/classes/globals.store.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +10 -14
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +12 -16
- package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js.map +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs +7 -13
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js +7 -13
- package/dist/martyrs/src/modules/globals/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +6 -7
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +7 -8
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
- 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/pages/Orders.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
- 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 +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +2 -2
- 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/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.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/products/components/blocks/CardCategory.vue.cjs +11 -5
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +12 -6
- package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +34 -13
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +35 -14
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +20 -9
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +21 -10
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/GanttChart.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/GanttChart.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.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.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/notifications.server.js +35 -2
- package/dist/notifications.server.mjs +35 -2
- package/dist/orders.server.js +3 -3
- package/dist/orders.server.mjs +3 -3
- package/dist/organizations.server.js +1 -1
- package/dist/organizations.server.mjs +1 -1
- package/dist/products.server.js +78 -53
- package/dist/products.server.mjs +78 -53
- package/dist/rents.server.js +1 -1
- package/dist/rents.server.mjs +1 -1
- package/dist/style.css +37 -38
- package/dist/wallet.server.js +1 -1
- package/dist/wallet.server.mjs +1 -1
- package/package.json +2 -1
- package/src/components/Feed/Feed.vue +2 -7
- package/src/components/Skeleton/Skeleton.vue +4 -5
- package/src/components/Tree/Tree.vue +5 -2
- package/src/modules/auth/controllers/middlewares/authJwt.js +1 -1
- package/src/modules/auth/views/store/auth.js +2 -1
- package/src/modules/globals/controllers/classes/globals.crud.js +2 -2
- package/src/modules/globals/views/classes/globals.store.js +119 -31
- package/src/modules/globals/views/components/partials/Navigation.vue +11 -10
- package/src/modules/globals/views/utils/vue-app-renderer.js +7 -16
- package/src/modules/icons/entities/IconMusic.vue +14 -0
- package/src/modules/icons/navigation/IconCheck.vue +31 -0
- package/src/modules/icons/navigation/IconHeart.vue +26 -0
- package/src/modules/icons/navigation/IconPause.vue +31 -0
- package/src/modules/icons/navigation/IconPlay.vue +17 -0
- package/src/modules/icons/navigation/IconRefresh.vue +31 -0
- package/src/modules/icons/navigation/IconShuffle.vue +31 -0
- package/src/modules/icons/navigation/IconVolume.vue +31 -0
- package/src/modules/music/components/SidebarMusic.vue +156 -0
- package/src/modules/music/components/cards/AlbumCard.vue +107 -0
- package/src/modules/music/components/cards/ArtistCard.vue +37 -0
- package/src/modules/music/components/cards/PlaylistCard.vue +100 -0
- package/src/modules/music/components/cards/TrackCard.vue +86 -0
- package/src/modules/music/components/forms/PlaylistForm.vue +156 -0
- package/src/modules/music/components/forms/SearchForm.vue +82 -0
- package/src/modules/music/components/forms/UploadForm.vue +313 -0
- package/src/modules/music/components/layouts/MusicLayout.vue +137 -0
- package/src/modules/music/components/lists/AlbumList.vue +25 -0
- package/src/modules/music/components/lists/ArtistList.vue +25 -0
- package/src/modules/music/components/lists/PlaylistList.vue +25 -0
- package/src/modules/music/components/lists/TrackList.vue +175 -0
- package/src/modules/music/components/pages/AlbumDetail.vue +265 -0
- package/src/modules/music/components/pages/ArtistDetail.vue +247 -0
- package/src/modules/music/components/pages/MusicHome.vue +177 -0
- package/src/modules/music/components/pages/MusicLibrary.vue +192 -0
- package/src/modules/music/components/pages/MusicUpload.vue +44 -0
- package/src/modules/music/components/pages/PlaylistDetail.vue +504 -0
- package/src/modules/music/components/pages/SearchResults.vue +397 -0
- package/src/modules/music/components/pages/TrackDetail.vue +143 -0
- package/src/modules/music/components/player/MusicPlayer.vue +202 -0
- package/src/modules/music/components/player/TrackProgress.vue +110 -0
- package/src/modules/music/components/player/VolumeControl.vue +98 -0
- package/src/modules/music/controllers/album.controller.js +98 -0
- package/src/modules/music/controllers/artist.controller.js +111 -0
- package/src/modules/music/controllers/genre.controller.js +71 -0
- package/src/modules/music/controllers/music.controller.js +174 -0
- package/src/modules/music/controllers/playlist.controller.js +182 -0
- package/src/modules/music/controllers/search.controller.js +103 -0
- package/src/modules/music/controllers/stream.controller.js +106 -0
- package/src/modules/music/models/album.model.js +61 -0
- package/src/modules/music/models/artist.model.js +67 -0
- package/src/modules/music/models/genre.model.js +42 -0
- package/src/modules/music/models/play-history.model.js +51 -0
- package/src/modules/music/models/playlist.model.js +69 -0
- package/src/modules/music/models/track.model.js +94 -0
- package/src/modules/music/music.client.js +186 -0
- package/src/modules/music/music.server.js +114 -0
- package/src/modules/music/policies/music.policies.js +84 -0
- package/src/modules/music/router/music.js +77 -0
- package/src/modules/music/routes/album.routes.js +62 -0
- package/src/modules/music/routes/artist.routes.js +67 -0
- package/src/modules/music/routes/genre.routes.js +60 -0
- package/src/modules/music/routes/music.routes.js +145 -0
- package/src/modules/music/routes/playlist.routes.js +99 -0
- package/src/modules/music/routes/search.routes.js +10 -0
- package/src/modules/music/routes/stream.routes.js +38 -0
- package/src/modules/music/store/albums.js +200 -0
- package/src/modules/music/store/artists.js +180 -0
- package/src/modules/music/store/player.js +397 -0
- package/src/modules/music/store/playlists.js +211 -0
- package/src/modules/music/store/search.js +126 -0
- package/src/modules/music/store/tracks.js +230 -0
- package/src/modules/music/websocket/streaming.handler.js +151 -0
- package/src/modules/notifications/controllers/notifications.controller.js +44 -1
- package/src/modules/notifications/notifications.server.js +0 -1
- package/src/modules/notifications/routes/notifications.routes.js +3 -0
- package/src/modules/orders/components/pages/OrderCreate.vue +0 -2
- package/src/modules/products/components/blocks/CardCategory.vue +5 -4
- package/src/modules/products/components/pages/Categories.vue +38 -20
- package/src/modules/products/components/pages/CategoryEdit.vue +16 -7
- package/src/modules/products/components/pages/ProductEdit.vue +1 -0
- package/src/modules/products/controllers/categories.controller.js +155 -103
- 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/components/Tab/Tab.vue2.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +0 -1
- package/dist/node_modules/.pnpm/@vue_shared@3.5.13/node_modules/@vue/shared/dist/shared.esm-bundler.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@vue_shared@3.5.13/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.cjs +0 -6
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.cjs.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js +0 -6
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.cjs.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js +0 -15
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.cjs +0 -11
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.cjs.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js +0 -11
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.cjs +0 -21
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.cjs.map +0 -1
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js +0 -21
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js.map +0 -1
- /package/dist/{node_modules/.pnpm/@vue_shared@3.5.13 → martyrs}/node_modules/@vue/shared/dist/shared.esm-bundler.cjs +0 -0
- /package/dist/{node_modules/.pnpm/@vue_shared@3.5.13 → martyrs}/node_modules/@vue/shared/dist/shared.esm-bundler.js +0 -0
- /package/dist/{node_modules → martyrs/node_modules}/fast-deep-equal/index.cjs +0 -0
- /package/dist/{node_modules → martyrs/node_modules}/fast-deep-equal/index.cjs.map +0 -0
- /package/dist/{node_modules → martyrs/node_modules}/fast-deep-equal/index.js +0 -0
- /package/dist/{node_modules → martyrs/node_modules}/fast-deep-equal/index.js.map +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
<!-- components/forms/UploadForm.vue -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="upload-form">
|
|
4
|
+
<!-- <form @submit.prevent="submitForm"> -->
|
|
5
|
+
<div class="form-group mn-b-medium">
|
|
6
|
+
<label for="title" class="t-white t-medium mn-b-thin d-block">Track Title</label>
|
|
7
|
+
<Field
|
|
8
|
+
v-model:field="form.title"
|
|
9
|
+
id="title"
|
|
10
|
+
type="text"
|
|
11
|
+
placeholder="Track Title"
|
|
12
|
+
:validation="validationErrors.title"
|
|
13
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
14
|
+
/>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div class="form-group mn-b-medium">
|
|
18
|
+
<label for="artist" class="t-white t-medium mn-b-thin d-block">Artist</label>
|
|
19
|
+
<Select
|
|
20
|
+
v-model:select="form.artist"
|
|
21
|
+
id="artist"
|
|
22
|
+
:options="artistOptions"
|
|
23
|
+
placeholder="Select an artist"
|
|
24
|
+
:validation="validationErrors.artist"
|
|
25
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
26
|
+
/>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="form-group mn-b-medium">
|
|
30
|
+
<label for="album" class="t-white t-medium mn-b-thin d-block">Album (Optional)</label>
|
|
31
|
+
<Select
|
|
32
|
+
v-model:select="form.album"
|
|
33
|
+
id="album"
|
|
34
|
+
:options="albumOptions"
|
|
35
|
+
placeholder="Select an album"
|
|
36
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
37
|
+
/>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="form-group mn-b-medium">
|
|
41
|
+
<label for="genre" class="t-white t-medium mn-b-thin d-block">Genre</label>
|
|
42
|
+
<Select
|
|
43
|
+
v-model:select="form.genre"
|
|
44
|
+
id="genre"
|
|
45
|
+
:options="genreOptions"
|
|
46
|
+
placeholder="Select a genre"
|
|
47
|
+
:validation="validationErrors.genre"
|
|
48
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
49
|
+
/>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div class="form-group mn-b-medium">
|
|
53
|
+
<label for="releaseDate" class="t-white t-medium mn-b-thin d-block">Release Date</label>
|
|
54
|
+
<Field
|
|
55
|
+
v-model:field="form.releaseDate"
|
|
56
|
+
id="releaseDate"
|
|
57
|
+
type="date"
|
|
58
|
+
:validation="validationErrors.releaseDate"
|
|
59
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
60
|
+
/>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<div class="form-group mn-b-medium">
|
|
64
|
+
<label for="isExplicit" class="t-white t-medium mn-b-thin d-block">Explicit Content</label>
|
|
65
|
+
<Checkbox
|
|
66
|
+
v-model:checkbox="form.isExplicit"
|
|
67
|
+
id="isExplicit"
|
|
68
|
+
label="This track contains explicit content"
|
|
69
|
+
class="t-white"
|
|
70
|
+
/>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div class="form-group mn-b-medium">
|
|
74
|
+
<label for="isPublic" class="t-white t-medium mn-b-thin d-block">Privacy</label>
|
|
75
|
+
<div class="flex gap-small">
|
|
76
|
+
<Radio
|
|
77
|
+
v-model:radio="form.isPublic"
|
|
78
|
+
:value="true"
|
|
79
|
+
name="privacy"
|
|
80
|
+
label="Public"
|
|
81
|
+
class="t-white"
|
|
82
|
+
/>
|
|
83
|
+
<Radio
|
|
84
|
+
v-model:radio="form.isPublic"
|
|
85
|
+
:value="false"
|
|
86
|
+
name="privacy"
|
|
87
|
+
label="Private"
|
|
88
|
+
class="t-white"
|
|
89
|
+
/>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<div class="form-group mn-b-medium">
|
|
94
|
+
<label class="t-white t-medium mn-b-thin d-block">Cover Image</label>
|
|
95
|
+
<div class="track-cover-upload flex gap-medium">
|
|
96
|
+
<div class="track-cover-preview bg-dark-transp-25 radius-small o-hidden">
|
|
97
|
+
<Media
|
|
98
|
+
v-if="form.coverUrl"
|
|
99
|
+
:url="form.coverUrl"
|
|
100
|
+
class="w-10r h-10r object-fit-cover"
|
|
101
|
+
/>
|
|
102
|
+
<div v-else class="w-10r h-10r flex-center flex">
|
|
103
|
+
<IconMusic class="i-big" fill="rgb(var(--grey))"/>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<UploadImage
|
|
108
|
+
v-model:photo="form.coverUrl"
|
|
109
|
+
uploadPath="tracks"
|
|
110
|
+
class="flex-1 h-10r bg-dark-transp-25 radius-small"
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div class="form-group mn-b-medium">
|
|
116
|
+
<label class="t-white t-medium mn-b-thin d-block">Track Audio File</label>
|
|
117
|
+
<Upload
|
|
118
|
+
v-model:field="form.fileUrl"
|
|
119
|
+
@file-change="(url) => form.fileUrl = url"
|
|
120
|
+
type="file"
|
|
121
|
+
uploadPath="tracks"
|
|
122
|
+
class="bg-dark-transp-25 radius-small pd-small t-white"
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="form-group mn-b-medium">
|
|
127
|
+
<label for="lyrics" class="t-white t-medium mn-b-thin d-block">Lyrics (Optional)</label>
|
|
128
|
+
<Field
|
|
129
|
+
v-model:field="form.lyrics"
|
|
130
|
+
id="lyrics"
|
|
131
|
+
type="textarea"
|
|
132
|
+
placeholder="Add lyrics"
|
|
133
|
+
class="w-100 pd-small bg-dark-transp-25 radius-small t-white"
|
|
134
|
+
/>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div class="form-actions t-right">
|
|
138
|
+
<Button
|
|
139
|
+
@click="resetForm"
|
|
140
|
+
type="button"
|
|
141
|
+
class="bg-dark-transp-25 t-white pd-small radius-small mn-r-small hover-bg-dark"
|
|
142
|
+
:showLoader="false"
|
|
143
|
+
:showSucces="false"
|
|
144
|
+
>
|
|
145
|
+
Reset
|
|
146
|
+
</Button>
|
|
147
|
+
|
|
148
|
+
<Button
|
|
149
|
+
type="submit"
|
|
150
|
+
class="bg-main t-white pd-small radius-small hover-scale-1"
|
|
151
|
+
:submit="() => submitForm()"
|
|
152
|
+
:showLoader="true"
|
|
153
|
+
:showSucces="true"
|
|
154
|
+
>
|
|
155
|
+
Upload Track
|
|
156
|
+
</Button>
|
|
157
|
+
</div>
|
|
158
|
+
<!-- </form> -->
|
|
159
|
+
</div>
|
|
160
|
+
</template>
|
|
161
|
+
|
|
162
|
+
<script setup>
|
|
163
|
+
import { ref, reactive, onMounted } from 'vue';
|
|
164
|
+
import Field from '@martyrs/src/components/Field/Field.vue';
|
|
165
|
+
import Select from '@martyrs/src/components/Select/Select.vue';
|
|
166
|
+
import Radio from '@martyrs/src/components/Radio/Radio.vue';
|
|
167
|
+
import Checkbox from '@martyrs/src/components/Checkbox/Checkbox.vue';
|
|
168
|
+
import Button from '@martyrs/src/components/Button/Button.vue';
|
|
169
|
+
import Upload from '@martyrs/src/components/Upload/Upload.vue';
|
|
170
|
+
import UploadImage from '@martyrs/src/components/UploadImage/UploadImage.vue';
|
|
171
|
+
import Media from '@martyrs/src/components/Media/Media.vue';
|
|
172
|
+
import IconMusic from '@martyrs/src/modules/icons/entities/IconMusic.vue';
|
|
173
|
+
|
|
174
|
+
// Import stores
|
|
175
|
+
import { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';
|
|
176
|
+
import { actions as tracksActions } from '../../store/tracks.js';
|
|
177
|
+
import { state as artistsState, actions as artistsActions } from '../../store/artists.js';
|
|
178
|
+
import { state as albumsState, actions as albumsActions } from '../../store/albums.js';
|
|
179
|
+
|
|
180
|
+
const emit = defineEmits(['uploaded']);
|
|
181
|
+
|
|
182
|
+
// Form data
|
|
183
|
+
const form = reactive({
|
|
184
|
+
title: '',
|
|
185
|
+
artist: null,
|
|
186
|
+
album: null,
|
|
187
|
+
genre: [],
|
|
188
|
+
releaseDate: new Date().toISOString().split('T')[0],
|
|
189
|
+
isExplicit: false,
|
|
190
|
+
isPublic: true,
|
|
191
|
+
coverUrl: '',
|
|
192
|
+
fileUrl: '',
|
|
193
|
+
lyrics: ''
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Options for dropdowns
|
|
197
|
+
const artistOptions = ref([]);
|
|
198
|
+
const albumOptions = ref([]);
|
|
199
|
+
const genreOptions = ref([
|
|
200
|
+
'Pop', 'Rock', 'Hip Hop', 'R&B', 'Jazz', 'Electronic', 'Classical', 'Country', 'Folk', 'Blues'
|
|
201
|
+
]);
|
|
202
|
+
|
|
203
|
+
// Validation
|
|
204
|
+
const validationErrors = reactive({});
|
|
205
|
+
|
|
206
|
+
/// Form submission with improved error handling
|
|
207
|
+
const submitForm = async () => {
|
|
208
|
+
// Validate form (I'm keeping this commented out as in your original code)
|
|
209
|
+
// validationErrors.title = !form.title ? { message: 'Track title is required' } : null;
|
|
210
|
+
// validationErrors.artist = !form.artist ? { message: 'Artist is required' } : null;
|
|
211
|
+
// validationErrors.genre = !form.genre || form.genre.length === 0 ? { message: 'Genre is required' } : null;
|
|
212
|
+
// validationErrors.fileUrl = !form.fileUrl ? { message: 'Audio file is required' } : null;
|
|
213
|
+
|
|
214
|
+
// // If there are validation errors, don't submit
|
|
215
|
+
// if (Object.values(validationErrors).some(error => error !== null)) {
|
|
216
|
+
// console.log(error)
|
|
217
|
+
// return;
|
|
218
|
+
// }
|
|
219
|
+
|
|
220
|
+
console.log('Submitting form data:', form);
|
|
221
|
+
|
|
222
|
+
// Check if the API URL is correct
|
|
223
|
+
console.log('API URL:', process.env.API_URL);
|
|
224
|
+
|
|
225
|
+
// Prepare track data
|
|
226
|
+
const trackData = {
|
|
227
|
+
...form,
|
|
228
|
+
creator: {
|
|
229
|
+
type: 'user', // Make sure type matches what's expected on the server (lowercase)
|
|
230
|
+
target: authState.user._id
|
|
231
|
+
},
|
|
232
|
+
owner: {
|
|
233
|
+
type: 'user', // Make sure type matches what's expected on the server (lowercase)
|
|
234
|
+
target: authState.user._id
|
|
235
|
+
},
|
|
236
|
+
status: 'draft' // Add a default status if needed
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
try {
|
|
240
|
+
console.log('Sending track data to API:', trackData);
|
|
241
|
+
|
|
242
|
+
// Directly use the Store instance to debug the issue
|
|
243
|
+
// This bypasses the action layer to see if the issue is there
|
|
244
|
+
// const directApiResult = await trackStore.create(trackData);
|
|
245
|
+
// console.log('Direct API result:', directApiResult);
|
|
246
|
+
|
|
247
|
+
// If the direct approach works, try the normal action
|
|
248
|
+
const track = await tracksActions.createTrack(trackData);
|
|
249
|
+
console.log('Track created successfully:', track);
|
|
250
|
+
|
|
251
|
+
emit('uploaded', track);
|
|
252
|
+
resetForm();
|
|
253
|
+
} catch (error) {
|
|
254
|
+
console.error('Error uploading track:', error);
|
|
255
|
+
|
|
256
|
+
// Add more detailed error logging
|
|
257
|
+
if (error.status) {
|
|
258
|
+
console.error(`HTTP Status: ${error.status}`);
|
|
259
|
+
}
|
|
260
|
+
if (error.message) {
|
|
261
|
+
console.error(`Error message: ${error.message}`);
|
|
262
|
+
}
|
|
263
|
+
if (error.stack) {
|
|
264
|
+
console.error(`Stack trace: ${error.stack}`);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Show error to user
|
|
268
|
+
// setError({
|
|
269
|
+
// message: 'Failed to upload track: ' + (error.message || 'Unknown error'),
|
|
270
|
+
// errorCode: error.errorCode || 'TRACK_UPLOAD_FAILED'
|
|
271
|
+
// });
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
const resetForm = () => {
|
|
275
|
+
Object.keys(form).forEach(key => {
|
|
276
|
+
if (key === 'releaseDate') {
|
|
277
|
+
form[key] = new Date().toISOString().split('T')[0];
|
|
278
|
+
} else if (key === 'isPublic') {
|
|
279
|
+
form[key] = true;
|
|
280
|
+
} else if (key === 'isExplicit') {
|
|
281
|
+
form[key] = false;
|
|
282
|
+
} else {
|
|
283
|
+
form[key] = '';
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Clear validation errors
|
|
288
|
+
Object.keys(validationErrors).forEach(key => {
|
|
289
|
+
validationErrors[key] = null;
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// Fetch artists and albums for dropdowns
|
|
294
|
+
onMounted(async () => {
|
|
295
|
+
try {
|
|
296
|
+
// Fetch user's artists
|
|
297
|
+
const userArtists = await artistsActions.fetchUserArtists(authState.user._id);
|
|
298
|
+
artistOptions.value = userArtists.map(artist => ({
|
|
299
|
+
name: artist.name,
|
|
300
|
+
value: artist._id
|
|
301
|
+
}));
|
|
302
|
+
|
|
303
|
+
// Fetch user's albums
|
|
304
|
+
const userAlbums = await albumsActions.fetchUserAlbums(authState.user._id);
|
|
305
|
+
albumOptions.value = userAlbums.map(album => ({
|
|
306
|
+
name: album.title,
|
|
307
|
+
value: album._id
|
|
308
|
+
}));
|
|
309
|
+
} catch (error) {
|
|
310
|
+
console.error('Error fetching artists and albums:', error);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
</script>
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<!-- components/layouts/MusicLayout.vue -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="music-layout flex flex-nowrap o-hidden w-100 h-100">
|
|
4
|
+
<!-- Main Content -->
|
|
5
|
+
<div class="flex-child-1 flex flex-column h-100 o-hidden">
|
|
6
|
+
<!-- Header Bar -->
|
|
7
|
+
<header class="flex-child-shrink-0 z-index-3 bg-dark flex-v-center flex-justify-between flex gap-small pd-small br-b br-solid br-dark-transp-20">
|
|
8
|
+
<div class="flex-v-center flex gap-small">
|
|
9
|
+
<div class="music-navigation-buttons flex gap-thin">
|
|
10
|
+
<button @click="$router.go(-1)" class="bg-black radius-extra flex-center flex aspect-1x1 i-medium cursor-pointer hover-bg-dark pd-micro">
|
|
11
|
+
<IconChevronLeft class="i-small" fill="rgb(var(--white))"/>
|
|
12
|
+
</button>
|
|
13
|
+
<button @click="$router.go(1)" class="bg-black radius-extra flex-center flex aspect-1x1 i-medium cursor-pointer hover-bg-dark pd-micro">
|
|
14
|
+
<IconChevronRight class="i-small" fill="rgb(var(--white))"/>
|
|
15
|
+
</button>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<h2 v-if="$route.meta.title" class="t-white">{{ $route.meta.title }}</h2>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div class="music-search-bar flex-child-1 mn-l-medium mn-r-medium" v-if="$route.name !== 'music-search'">
|
|
22
|
+
<SearchForm @search="handleSearch" placeholder="Search music..." />
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div class="music-user-menu pos-relative">
|
|
26
|
+
<Button
|
|
27
|
+
v-if="isAuthenticated"
|
|
28
|
+
@click="showUserMenu = !showUserMenu"
|
|
29
|
+
class="bg-black radius-extra flex-v-center flex pd-thin hover-bg-dark"
|
|
30
|
+
:showLoader="false"
|
|
31
|
+
:showSucces="false"
|
|
32
|
+
>
|
|
33
|
+
<span v-if="user && user.profile" class="t-nowrap t-medium t-truncate w-max-10r mn-r-thin">{{ user.profile.name }}</span>
|
|
34
|
+
<IconProfile class="i-medium" fill="rgb(var(--white))"/>
|
|
35
|
+
</Button>
|
|
36
|
+
|
|
37
|
+
<!-- User dropdown menu -->
|
|
38
|
+
<Dropdown
|
|
39
|
+
v-if="showUserMenu"
|
|
40
|
+
class="pos-absolute pos-t-100 pos-r-0 mn-t-thin pd-small bg-dark radius-small z-index-5"
|
|
41
|
+
:align="'right'"
|
|
42
|
+
>
|
|
43
|
+
<ul class="w-max-15r">
|
|
44
|
+
<li class="mn-b-thin w-100">
|
|
45
|
+
<router-link :to="{ name: 'music-library' }" class="t-white pd-thin w-100 d-block hover-bg-dark-medium radius-small">
|
|
46
|
+
My Library
|
|
47
|
+
</router-link>
|
|
48
|
+
</li>
|
|
49
|
+
<li class="mn-b-thin w-100">
|
|
50
|
+
<router-link :to="{ name: 'music-upload' }" class="t-white pd-thin w-100 d-block hover-bg-dark-medium radius-small">
|
|
51
|
+
Upload Music
|
|
52
|
+
</router-link>
|
|
53
|
+
</li>
|
|
54
|
+
<li class="w-100">
|
|
55
|
+
<button @click="logout" class="t-white bg-transparent border-none w-100 t-left pd-thin hover-bg-dark-medium radius-small cursor-pointer">
|
|
56
|
+
Logout
|
|
57
|
+
</button>
|
|
58
|
+
</li>
|
|
59
|
+
</ul>
|
|
60
|
+
</Dropdown>
|
|
61
|
+
|
|
62
|
+
<Button
|
|
63
|
+
v-else
|
|
64
|
+
@click="login"
|
|
65
|
+
class="bg-main radius-extra pd-small t-white hover-scale-1"
|
|
66
|
+
:showLoader="false"
|
|
67
|
+
:showSucces="false"
|
|
68
|
+
>
|
|
69
|
+
Login
|
|
70
|
+
</Button>
|
|
71
|
+
</div>
|
|
72
|
+
</header>
|
|
73
|
+
|
|
74
|
+
<!-- Main Content Area -->
|
|
75
|
+
<main class="flex-child-1 o-y-scroll o-x-hidden bg-black-transp-95">
|
|
76
|
+
<div class="mn-small">
|
|
77
|
+
<router-view></router-view>
|
|
78
|
+
</div>
|
|
79
|
+
</main>
|
|
80
|
+
|
|
81
|
+
<!-- Music Player Fixed at Bottom -->
|
|
82
|
+
<MusicPlayer v-if="currentTrack" class="flex-child-shrink-0"/>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</template>
|
|
86
|
+
|
|
87
|
+
<script setup>
|
|
88
|
+
import { ref, computed, onMounted } from 'vue';
|
|
89
|
+
import { useRouter } from 'vue-router';
|
|
90
|
+
import MusicPlayer from '../player/MusicPlayer.vue';
|
|
91
|
+
import SearchForm from '../forms/SearchForm.vue';
|
|
92
|
+
import Button from '@martyrs/src/components/Button/Button.vue';
|
|
93
|
+
import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';
|
|
94
|
+
|
|
95
|
+
// Icons - Import from icons in the Martyrs framework
|
|
96
|
+
import IconChevronLeft from '@martyrs/src/modules/icons/navigation/IconChevronLeft.vue';
|
|
97
|
+
import IconChevronRight from '@martyrs/src/modules/icons/navigation/IconChevronRight.vue';
|
|
98
|
+
import IconProfile from '@martyrs/src/modules/icons/entities/IconProfile.vue';
|
|
99
|
+
|
|
100
|
+
// Import store modules
|
|
101
|
+
import { state as playerState } from '../../store/player.js';
|
|
102
|
+
import { state as authState, actions as authActions } from '@martyrs/src/modules/auth/views/store/auth.js';
|
|
103
|
+
|
|
104
|
+
const router = useRouter();
|
|
105
|
+
|
|
106
|
+
// UI state
|
|
107
|
+
const showUserMenu = ref(false);
|
|
108
|
+
|
|
109
|
+
// Auth computed properties
|
|
110
|
+
const isAuthenticated = computed(() => {
|
|
111
|
+
return authState.access.status === true;
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const user = computed(() => {
|
|
115
|
+
return authState.user;
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Current track from player store
|
|
119
|
+
const currentTrack = computed(() => {
|
|
120
|
+
return playerState.currentTrack;
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// Methods
|
|
124
|
+
const handleSearch = (query) => {
|
|
125
|
+
router.push({ name: 'music-search', query: { q: query } });
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const login = () => {
|
|
129
|
+
router.push({ name: 'Sign In', query: { redirect: router.currentRoute.value.fullPath } });
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const logout = async () => {
|
|
133
|
+
await authActions.logout();
|
|
134
|
+
showUserMenu.value = false;
|
|
135
|
+
router.push({ name: 'music-home' });
|
|
136
|
+
};
|
|
137
|
+
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!-- components/lists/AlbumList.vue -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="album-list">
|
|
4
|
+
<div v-if="albums.length === 0" class="empty-list t-center pd-medium">
|
|
5
|
+
<p class="t-grey">No albums found</p>
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<div v-else class="album-grid cols-5 mobile:cols-2 gap-small">
|
|
9
|
+
<div v-for="album in albums" :key="album._id">
|
|
10
|
+
<AlbumCard :album="album" class="hover-scale-1 transition-cubic-in-out" />
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script setup>
|
|
17
|
+
import AlbumCard from '../cards/AlbumCard.vue';
|
|
18
|
+
|
|
19
|
+
const props = defineProps({
|
|
20
|
+
albums: {
|
|
21
|
+
type: Array,
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!-- components/lists/ArtistList.vue -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="artist-list">
|
|
4
|
+
<div v-if="artists.length === 0" class="empty-list t-center pd-medium">
|
|
5
|
+
<p class="t-grey">No artists found</p>
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<div v-else class="artist-grid cols-6 mobile:cols-3 gap-small">
|
|
9
|
+
<div v-for="artist in artists" :key="artist._id">
|
|
10
|
+
<ArtistCard :artist="artist" class="hover-scale-1 transition-cubic-in-out" />
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script setup>
|
|
17
|
+
import ArtistCard from '../cards/ArtistCard.vue';
|
|
18
|
+
|
|
19
|
+
const props = defineProps({
|
|
20
|
+
artists: {
|
|
21
|
+
type: Array,
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!-- components/lists/PlaylistList.vue -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="playlist-list">
|
|
4
|
+
<div v-if="playlists.length === 0" class="empty-list t-center pd-medium">
|
|
5
|
+
<p class="t-grey">No playlists found</p>
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<div v-else class="playlist-grid cols-5 mobile:cols-2 gap-small">
|
|
9
|
+
<div v-for="playlist in playlists" :key="playlist._id">
|
|
10
|
+
<PlaylistCard :playlist="playlist" class="hover-scale-1 transition-cubic-in-out" />
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script setup>
|
|
17
|
+
import PlaylistCard from '../cards/PlaylistCard.vue';
|
|
18
|
+
|
|
19
|
+
const props = defineProps({
|
|
20
|
+
playlists: {
|
|
21
|
+
type: Array,
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
</script>
|