CreatePlaylist.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <modal title="Create Playlist" :size="'slim'">
  3. <template #body>
  4. <p class="control is-expanded">
  5. <label class="label">Display Name</label>
  6. <input
  7. v-model="playlist.displayName"
  8. class="input"
  9. type="text"
  10. placeholder="Enter display name..."
  11. autofocus
  12. @keyup.enter="createPlaylist()"
  13. />
  14. </p>
  15. <div class="control" id="privacy-selection">
  16. <label class="label">Privacy</label>
  17. <p class="control is-expanded select">
  18. <select v-model="playlist.privacy">
  19. <option value="private">Private</option>
  20. <option value="public" selected>Public</option>
  21. </select>
  22. </p>
  23. </div>
  24. </template>
  25. <template #footer>
  26. <a class="button is-info" @click="createPlaylist()"
  27. ><i class="material-icons icon-with-button">create</i>Create
  28. Playlist</a
  29. >
  30. </template>
  31. </modal>
  32. </template>
  33. <script>
  34. import { mapActions, mapGetters } from "vuex";
  35. import Toast from "toasters";
  36. import validation from "@/validation";
  37. export default {
  38. props: {
  39. modalUuid: { type: String, default: "" }
  40. },
  41. data() {
  42. return {
  43. playlist: {
  44. displayName: "",
  45. privacy: "public",
  46. songs: []
  47. }
  48. };
  49. },
  50. computed: mapGetters({
  51. socket: "websockets/getSocket"
  52. }),
  53. unmounted() {
  54. if (window.addToPlaylistDropdown)
  55. window.addToPlaylistDropdown.tippy.setProps({
  56. zIndex: 9999,
  57. hideOnClick: true
  58. });
  59. window.addToPlaylistDropdown = null;
  60. },
  61. methods: {
  62. createPlaylist() {
  63. const { displayName } = this.playlist;
  64. if (!validation.isLength(displayName, 2, 32))
  65. return new Toast(
  66. "Display name must have between 2 and 32 characters."
  67. );
  68. if (!validation.regex.ascii.test(displayName))
  69. return new Toast(
  70. "Invalid display name format. Only ASCII characters are allowed."
  71. );
  72. return this.socket.dispatch(
  73. "playlists.create",
  74. this.playlist,
  75. res => {
  76. new Toast(res.message);
  77. if (res.status === "success") {
  78. this.closeModal("createPlaylist");
  79. if (!window.addToPlaylistDropdown) {
  80. this.openModal({
  81. modal: "editPlaylist",
  82. data: { playlistId: res.data.playlistId }
  83. });
  84. }
  85. }
  86. }
  87. );
  88. },
  89. ...mapActions("modalVisibility", ["closeModal", "openModal"])
  90. }
  91. };
  92. </script>