Skip to content
Snippets Groups Projects
Modal.vue 8.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
    <template>
      <modal
    
        ref="modal"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
        :show="show"
        :scrolling="true"
    
        :additional-classes="['scrolling-track-options']"
        @update:show="$emit('update:show', $event)"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
      >
        <div class="header">
          <div class="ui large centered rounded image">
            <img
              v-if="
                track.album && track.album.cover && track.album.cover.urls.original
              "
              v-lazy="
                $store.getters['instance/absoluteUrl'](
                  track.album.cover.urls.medium_square_crop
                )
              "
              alt=""
              class="ui centered image"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              v-else-if="track.cover"
              v-lazy="
                $store.getters['instance/absoluteUrl'](
                  track.cover.urls.medium_square_crop
                )
              "
              alt=""
              class="ui centered image"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              v-else-if="track.artist.cover"
              v-lazy="
                $store.getters['instance/absoluteUrl'](
                  track.artist.cover.urls.medium_square_crop
                )
              "
              alt=""
              class="ui centered image"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              v-else
    
              alt=""
              class="ui centered image"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              src="../../../assets/audio/default-cover.png"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          </div>
    
          <h3 class="track-modal-title">
            {{ track.title }}
          </h3>
          <h4 class="track-modal-subtitle">
            {{ track.artist.name }}
          </h4>
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
        </div>
    
        <div class="ui hidden divider" />
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
        <div class="content">
          <div class="ui one column unstackable grid">
    
            <div
              v-if="$store.state.auth.authenticated && track.artist.content_category !== 'podcast'"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              class="row"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              <div
                tabindex="0"
                class="column"
                role="button"
                :aria-label="favoriteButton"
                @click.stop="$store.dispatch('favorites/toggle', track.id)"
              >
                <i
                  :class="[
                    'heart',
                    'favorite-icon',
                    { favorited: isFavorite },
                    { pink: isFavorite },
                    'icon',
                    'track-modal',
                    'list-icon',
                  ]"
                />
                <span class="track-modal list-item">{{ favoriteButton }}</span>
              </div>
            </div>
            <div class="row">
              <div
                class="column"
                role="button"
    
                :aria-label="labels.addToQueue"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                @click.stop.prevent="
                  add();
    
                  $refs.modal.closeModal();
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                "
              >
                <i class="plus icon track-modal list-icon" />
                <span class="track-modal list-item">{{ labels.addToQueue }}</span>
              </div>
            </div>
            <div class="row">
              <div
                class="column"
                role="button"
    
                :aria-label="labels.playNext"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                @click.stop.prevent="
                  addNext(true);
    
                  $refs.modal.closeModal();
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                "
              >
                <i class="step forward icon track-modal list-icon" />
                <span class="track-modal list-item">{{ labels.playNext }}</span>
              </div>
            </div>
            <div class="row">
              <div
                class="column"
                role="button"
    
                :aria-label="labels.startRadio"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                @click.stop.prevent="
                  $store.dispatch('radios/start', {
                    type: 'similar',
                    objectId: track.id,
                  });
    
                  $refs.modal.closeModal();
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
                "
              >
                <i class="rss icon track-modal list-icon" />
                <span class="track-modal list-item">{{ labels.startRadio }}</span>
              </div>
            </div>
            <div class="row">
              <div
                class="column"
                role="button"
                :aria-label="labels.addToPlaylist"
    
                @click.stop="$store.commit('playlists/chooseTrack', track)"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              >
                <i class="list icon track-modal list-icon" />
                <span class="track-modal list-item">{{
                  labels.addToPlaylist
                }}</span>
              </div>
            </div>
    
            <div class="ui divider" />
            <div
              v-if="!isAlbum && track.album"
              class="row"
            >
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              <div
                class="column"
                role="button"
                :aria-label="albumDetailsButton"
                @click.prevent.exact="
                  $router.push({
                    name: 'library.albums.detail',
                    params: { id: track.album.id },
                  })
                "
              >
                <i class="compact disc icon track-modal list-icon" />
                <span class="track-modal list-item">{{
                  albumDetailsButton
                }}</span>
              </div>
            </div>
    
            <div
              v-if="!isArtist"
              class="row"
            >
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              <div
                class="column"
                role="button"
                :aria-label="artistDetailsButton"
                @click.prevent.exact="
                  $router.push({
                    name: 'library.artists.detail',
                    params: { id: track.artist.id },
                  })
                "
              >
                <i class="user icon track-modal list-icon" />
                <span class="track-modal list-item">{{
                  artistDetailsButton
                }}</span>
              </div>
            </div>
            <div class="row">
              <div
                class="column"
                role="button"
                :aria-label="trackDetailsButton"
                @click.prevent.exact="
                  $router.push({
                    name: 'library.tracks.detail',
                    params: { id: track.id },
                  })
                "
              >
                <i class="info icon track-modal list-icon" />
                <span class="track-modal list-item">{{
                  trackDetailsButton
                }}</span>
              </div>
            </div>
    
            <div class="ui divider" />
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
            <div
              v-for="obj in getReportableObjs({
                track,
                album,
                artist,
              })"
              :key="obj.target.type + obj.target.id"
              :ref="`report${obj.target.type}${obj.target.id}`"
    
              class="row"
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              :data-ref="`report${obj.target.type}${obj.target.id}`"
              @click.stop.prevent="$store.dispatch('moderation/report', obj.target)"
            >
              <div class="column">
                <i class="share icon track-modal list-icon" /><span
                  class="track-modal list-item"
    
                >{{ obj.label }}</span>
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
              </div>
            </div>
          </div>
        </div>
      </modal>
    </template>
    
    <script>
    
    Ciaran Ainsworth's avatar
    Ciaran Ainsworth committed
    import Modal from '@/components/semantic/Modal.vue'
    import ReportMixin from '@/components/mixins/Report.vue'
    import PlayOptionsMixin from '@/components/mixins/PlayOptions.vue'
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
    
    export default {
    
      components: {
        Modal
      },
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
      mixins: [ReportMixin, PlayOptionsMixin],
      props: {
        show: { type: Boolean, required: true, default: false },
        track: { type: Object, required: true },
        index: { type: Number, required: true },
        isArtist: { type: Boolean, required: false, default: false },
    
        isAlbum: { type: Boolean, required: false, default: false }
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
      },
    
      data () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
        return {
          isShowing: this.show,
          tracks: [this.track],
          album: this.track.album,
    
          artist: this.track.artist
        }
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
      },
      computed: {
    
        isFavorite () {
          return this.$store.getters['favorites/isFavorite'](this.track.id)
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
        },
    
        favoriteButton () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          if (this.isFavorite) {
            return this.$pgettext(
    
              'Content/Track/Icon.Tooltip/Verb',
              'Remove from favorites'
            )
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          } else {
    
            return this.$pgettext('Content/Track/*/Verb', 'Add to favorites')
    
        trackDetailsButton () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          if (this.track.artist.content_category === 'podcast') {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'Episode details')
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          } else {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'Track details')
    
        albumDetailsButton () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          if (this.track.artist.content_category === 'podcast') {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View series')
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          } else {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View album')
    
        artistDetailsButton () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          if (this.track.artist.content_category === 'podcast') {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View channel')
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          } else {
    
            return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View artist')
    
        labels () {
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
          return {
            startRadio: this.$pgettext(
    
              '*/Queue/Dropdown/Button/Title',
              'Play radio'
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
            ),
    
            playNow: this.$pgettext('*/Queue/Dropdown/Button/Title', 'Play now'),
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
            addToQueue: this.$pgettext(
    
              '*/Queue/Dropdown/Button/Title',
              'Add to queue'
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
            ),
    
            playNext: this.$pgettext('*/Queue/Dropdown/Button/Title', 'Play next'),
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
            addToPlaylist: this.$pgettext(
    
              'Sidebar/Player/Icon.Tooltip/Verb',
              'Add to playlist…'
            )
          }
        }
      }
    }
    
    Ciarán Ainsworth's avatar
    Ciarán Ainsworth committed
    </script>