EditPlaylist.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <div class='modal is-active'>
  3. <div class='modal-background'></div>
  4. <div class='modal-card'>
  5. <header class='modal-card-head'>
  6. <p class='modal-card-title'>Editing: {{ 'Ultimate Playlist' }}</p>
  7. <button class='delete' @click='$parent.toggleModal("editPlaylist")'></button>
  8. </header>
  9. <section class='modal-card-body'>
  10. <aside class='menu'>
  11. <ul class='menu-list'>
  12. <li>
  13. <!--repeat for each song in playlist-->
  14. <a :href='' target='_blank'>Clean Bandit - Rockabye ft. Sean Paul & Anne-Marie</a>
  15. <div class='controls'>
  16. <a href='#' @click=''><i class='material-icons'>keyboard_arrow_down</i></a>
  17. <a href='#' @click=''><i class='material-icons'>keyboard_arrow_up</i></a>
  18. <a href='#' @click=''><i class='material-icons'>delete</i></a>
  19. </div>
  20. </li>
  21. </ul>
  22. </aside>
  23. <br />
  24. <div class='control is-grouped'>
  25. <p class='control is-expanded'>
  26. <input class='input' type='text' placeholder='Search for Song to add' v-model='songQuery'>
  27. </p>
  28. <p class='control'>
  29. <a class='button is-info' @click='searchForSongs()'>Search</a>
  30. </p>
  31. </div>
  32. <table class='table' v-if='songQueryResults.length > 0'>
  33. <tbody>
  34. <tr v-for='result in songQueryResults'>
  35. <td>
  36. <img :src='result.thumbnail' />
  37. </td>
  38. <td>{{ result.title }}</td>
  39. <td>
  40. <a class='button is-success' @click='addSongToPlaylist(result.id)'>
  41. Add
  42. </a>
  43. </td>
  44. </tr>
  45. </tbody>
  46. </table>
  47. <div class='control is-grouped'>
  48. <p class='control is-expanded'>
  49. <input class='input' type='text' placeholder='YouTube Playlist URL'>
  50. </p>
  51. <p class='control'>
  52. <a class='button is-info' @click='submitQuery()'>Import</a>
  53. </p>
  54. </div>
  55. <h5>Edit playlist details:</h5>
  56. <div class='control is-grouped'>
  57. <p class='control is-expanded'>
  58. <input class='input' type='text' placeholder='Playlist Display Name'>
  59. </p>
  60. <p class='control'>
  61. <a class='button is-info' @click='renamePlaylist()'>Rename</a>
  62. </p>
  63. </div>
  64. </section>
  65. <footer class='modal-card-foot'>
  66. <a class='button is-danger' @click=''>Delete Playlist</a>
  67. </footer>
  68. </div>
  69. </div>
  70. </template>
  71. <script>
  72. import { Toast } from 'vue-roaster';
  73. export default {
  74. data() {
  75. return {
  76. playlist: {},
  77. songQuery: '',
  78. songQueryResults: []
  79. }
  80. },
  81. methods: {
  82. searchForSongs: function () {
  83. let _this = this;
  84. _this.socket.emit('apis.searchYoutube', _this.querySearch, res => {
  85. if (res.status == 'success') {
  86. _this.songQueryResults = [];
  87. for (let i = 0; i < res.data.items.length; i++) {
  88. _this.songQueryResults.push({
  89. id: res.data.items[i].id.videoId,
  90. url: `https://www.youtube.com/watch?v=${this.id}`,
  91. title: res.data.items[i].snippet.title,
  92. thumbnail: res.data.items[i].snippet.thumbnails.default.url
  93. });
  94. }
  95. } else if (res.status == 'error') Toast.methods.addToast(res.message, 3000);
  96. });
  97. },
  98. addSongToPlaylist: function () {
  99. },
  100. addPlaylist: function () {
  101. },
  102. renamePlaylist: function () {
  103. }
  104. },
  105. ready: function () {
  106. let _this = this;
  107. let socketInterval = setInterval(() => {
  108. if (!!_this.$parent.$parent.socket) {
  109. _this.socket = _this.$parent.$parent.socket;
  110. // _this.$parent.playlistBeingEdited - get that playlist id from socket
  111. clearInterval(socketInterval);
  112. }
  113. }, 100);
  114. }
  115. }
  116. </script>
  117. <style type='scss' scoped>
  118. .menu { padding: 0 20px; }
  119. .menu-list li {
  120. display: flex;
  121. justify-content: space-between;
  122. }
  123. .menu-list a:hover { color: #000 !important; }
  124. li a {
  125. display: flex;
  126. align-items: center;
  127. }
  128. .controls {
  129. display: flex;
  130. a {
  131. display: flex;
  132. align-items: center;
  133. }
  134. }
  135. .table {
  136. margin-bottom: 0;
  137. }
  138. h5 { padding: 20px 0; }
  139. </style>