forked from rc/aircox
64 lines
2.5 KiB
Vue
64 lines
2.5 KiB
Vue
<template>
|
|
<div :class="['a-sound-item m-0 button-group', playing && 'playing' || '']">
|
|
<slot name="title" :player="player" :item="item" :loaded="loaded">
|
|
<span :class="['label is-flex-grow-1 align-left', playing && 'blink' || '']" @click.stop="$emit('togglePlay')">
|
|
{{ name || item.name }}
|
|
</span>
|
|
</slot>
|
|
<slot name="after-title" :player="player" :item="item" :loaded="loaded">
|
|
</slot>
|
|
<div class="button-group actions">
|
|
<a class="button action" v-if="hasAction('page')"
|
|
:href="item.data.page_url">
|
|
<span class="icon is-small">
|
|
<i class="fa fa-external-link"></i>
|
|
</span>
|
|
</a>
|
|
<a class="button action"
|
|
v-if="hasAction('download') && item.data.is_downloadable"
|
|
:href="item.data.url" target="_blank">
|
|
<span class="icon is-small">
|
|
<span class="fa fa-download"></span>
|
|
</span>
|
|
</a>
|
|
<button :class="['button action', pinned ? 'selected' : 'not-selected']"
|
|
v-if="hasAction('pin') && player && player.sets.pin != $parent.set" @click.stop="player.togglePlaylist('pin', item)">
|
|
<span class="icon is-small">
|
|
<span class="fa fa-star"></span>
|
|
</span>
|
|
</button>
|
|
<slot name="actions" :player="player" :item="item" :loaded="loaded"></slot>
|
|
</div>
|
|
<slot name="extra-right" :player="player" :item="item" :loaded="loaded"></slot>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import Model from '../model';
|
|
import Sound from '../sound';
|
|
|
|
export default {
|
|
props: {
|
|
data: {type: Object, default: () => {}},
|
|
name: String,
|
|
player: Object,
|
|
page_url: String,
|
|
actions: {type:Array, default: () => []},
|
|
index: {type:Number, default: null},
|
|
},
|
|
|
|
computed: {
|
|
item() { return this.data instanceof Model ? this.data : new Sound(this.data || {}); },
|
|
loaded() { return this.player && this.player.isLoaded(this.item) },
|
|
playing() { return this.player && this.player.isPlaying(this.item) },
|
|
paused() { return this.player && this.player.paused && this.loaded },
|
|
pinned() { return this.player && this.player.sets.pin.find(this.item) },
|
|
},
|
|
|
|
methods: {
|
|
hasAction(action) {
|
|
return this.actions && this.actions.indexOf(action) != -1;
|
|
},
|
|
}
|
|
}
|
|
</script>
|