Newer
Older
:additional-classes="['scrolling-track-options']"
@update:show="$emit('update:show', $event)"
>
<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"
v-else-if="track.cover"
v-lazy="
$store.getters['instance/absoluteUrl'](
track.cover.urls.medium_square_crop
)
"
alt=""
class="ui centered image"
v-else-if="track.artist.cover"
v-lazy="
$store.getters['instance/absoluteUrl'](
track.artist.cover.urls.medium_square_crop
)
"
alt=""
class="ui centered image"
<h3 class="track-modal-title">
{{ track.title }}
</h3>
<h4 class="track-modal-subtitle">
{{ track.artist.name }}
</h4>
<div class="content">
<div class="ui one column unstackable grid">
<div
v-if="$store.state.auth.authenticated && track.artist.content_category !== 'podcast'"
<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"
"
>
<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"
"
>
<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"
@click.stop.prevent="
$store.dispatch('radios/start', {
type: 'similar',
objectId: track.id,
});
"
>
<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)"
>
<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"
>
<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"
>
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<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
v-for="obj in getReportableObjs({
track,
album,
artist,
})"
:key="obj.target.type + obj.target.id"
:ref="`report${obj.target.type}${obj.target.id}`"
: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"
</div>
</div>
</div>
</div>
</modal>
</template>
<script>
import Modal from '@/components/semantic/Modal.vue'
import ReportMixin from '@/components/mixins/Report.vue'
import PlayOptionsMixin from '@/components/mixins/PlayOptions.vue'
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 }
return {
isShowing: this.show,
tracks: [this.track],
album: this.track.album,
isFavorite () {
return this.$store.getters['favorites/isFavorite'](this.track.id)
'Content/Track/Icon.Tooltip/Verb',
'Remove from favorites'
)
return this.$pgettext('Content/Track/*/Verb', 'Add to favorites')
if (this.track.artist.content_category === 'podcast') {
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'Episode details')
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'Track details')
if (this.track.artist.content_category === 'podcast') {
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View series')
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View album')
if (this.track.artist.content_category === 'podcast') {
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View channel')
return this.$pgettext('*/Queue/Dropdown/Button/Label/Short', 'View artist')
'*/Queue/Dropdown/Button/Title',
'Play radio'
playNow: this.$pgettext('*/Queue/Dropdown/Button/Title', 'Play now'),
'*/Queue/Dropdown/Button/Title',
'Add to queue'
playNext: this.$pgettext('*/Queue/Dropdown/Button/Title', 'Play next'),
'Sidebar/Player/Icon.Tooltip/Verb',
'Add to playlist…'
)
}
}
}
}