|
@@ -0,0 +1,167 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <metadata title="Admin | Playlists" />
|
|
|
+ <div class="container">
|
|
|
+ <table class="table is-striped">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <td>Display name</td>
|
|
|
+ <td>Is user modifiable</td>
|
|
|
+ <td>Songs #</td>
|
|
|
+ <td>Playlist length</td>
|
|
|
+ <td>Created by</td>
|
|
|
+ <td>Created at</td>
|
|
|
+ <td>Playlist id</td>
|
|
|
+ <!-- <td>Options</td> -->
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr v-for="playlist in playlists" :key="playlist._id">
|
|
|
+ <td>{{ playlist.displayName }}</td>
|
|
|
+ <td>{{ playlist.isUserModifiable }}</td>
|
|
|
+ <td>{{ playlist.songs.length }}</td>
|
|
|
+ <td>{{ totalLengthForPlaylist(playlist.songs) }}</td>
|
|
|
+ <td>
|
|
|
+ <user-id-to-username
|
|
|
+ :user-id="playlist.createdBy"
|
|
|
+ :link="true"
|
|
|
+ />
|
|
|
+ </td>
|
|
|
+ <td :title="new Date(playlist.createdAt)">
|
|
|
+ {{ getDateFormatted(playlist.createdAt) }}
|
|
|
+ </td>
|
|
|
+ <td>{{ playlist._id }}</td>
|
|
|
+ <!-- <td>
|
|
|
+ <button
|
|
|
+ class="button is-primary"
|
|
|
+ @click="edit(playlist)"
|
|
|
+ >
|
|
|
+ Edit
|
|
|
+ </button>
|
|
|
+ </td> -->
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ <!-- <edit-playlist
|
|
|
+ v-if="modals.editPlaylist"
|
|
|
+ :user-id="editingPlaylistId"
|
|
|
+ sector="admin"
|
|
|
+ /> -->
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import { mapState, mapActions } from "vuex";
|
|
|
+
|
|
|
+// import EditPlaylist from "../../../components/modals/EditPlaylist.vue";
|
|
|
+import UserIdToUsername from "../../../components/common/UserIdToUsername.vue";
|
|
|
+
|
|
|
+import io from "../../../io";
|
|
|
+import utils from "../../../../js/utils";
|
|
|
+
|
|
|
+export default {
|
|
|
+ components: { /* EditPlaylist, */ UserIdToUsername },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ utils,
|
|
|
+ // editingPlaylistId: "",
|
|
|
+ playlists: []
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState("modalVisibility", {
|
|
|
+ modals: state => state.modals.admin
|
|
|
+ })
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ console.log("mounted");
|
|
|
+
|
|
|
+ io.getSocket(socket => {
|
|
|
+ this.socket = socket;
|
|
|
+ if (this.socket.connected) this.init();
|
|
|
+ io.onConnect(() => this.init());
|
|
|
+ });
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // edit(playlist) {
|
|
|
+ // this.editingPlaylistId = playlist._id;
|
|
|
+ // this.openModal({ sector: "admin", modal: "editPlaylist" });
|
|
|
+ // },
|
|
|
+ init() {
|
|
|
+ this.socket.emit("playlists.index", res => {
|
|
|
+ console.log(res);
|
|
|
+ if (res.status === "success") {
|
|
|
+ this.playlists = res.data;
|
|
|
+ // if (this.$route.query.userId) {
|
|
|
+ // const user = this.users.find(
|
|
|
+ // user => user._id === this.$route.query.userId
|
|
|
+ // );
|
|
|
+ // if (user) this.edit(user);
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.socket.emit("apis.joinAdminRoom", "playlists", () => {});
|
|
|
+ },
|
|
|
+ getDateFormatted(createdAt) {
|
|
|
+ const date = new Date(createdAt);
|
|
|
+ const year = date.getFullYear();
|
|
|
+ const month = `${date.getMonth() + 1}`.padStart(2, 0);
|
|
|
+ const day = `${date.getDate()}`.padStart(2, 0);
|
|
|
+ const hour = `${date.getHours()}`.padStart(2, 0);
|
|
|
+ const minute = `${date.getMinutes()}`.padStart(2, 0);
|
|
|
+ return `${year}-${month}-${day} ${hour}:${minute}`;
|
|
|
+ },
|
|
|
+ totalLengthForPlaylist(songs) {
|
|
|
+ let length = 0;
|
|
|
+ songs.forEach(song => {
|
|
|
+ length += song.duration;
|
|
|
+ });
|
|
|
+ return this.utils.formatTimeLong(length);
|
|
|
+ },
|
|
|
+ ...mapActions("modalVisibility", ["openModal"])
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import "../../../styles/global.scss";
|
|
|
+
|
|
|
+.night-mode {
|
|
|
+ .table {
|
|
|
+ color: $night-mode-text;
|
|
|
+ background-color: $night-mode-bg-secondary;
|
|
|
+
|
|
|
+ thead tr {
|
|
|
+ background: $night-mode-bg-secondary;
|
|
|
+ td {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tbody tr:hover {
|
|
|
+ background-color: #111 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ tbody tr:nth-child(even) {
|
|
|
+ background-color: #444;
|
|
|
+ }
|
|
|
+
|
|
|
+ strong {
|
|
|
+ color: $night-mode-text;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+body {
|
|
|
+ font-family: "Hind", sans-serif;
|
|
|
+}
|
|
|
+
|
|
|
+td {
|
|
|
+ vertical-align: middle;
|
|
|
+}
|
|
|
+
|
|
|
+.is-primary:focus {
|
|
|
+ background-color: $primary-color !important;
|
|
|
+}
|
|
|
+</style>
|