Remove files commited by accident
This commit is contained in:
parent
71cd5edd2a
commit
d641d4985c
|
@ -1,460 +0,0 @@
|
||||||
<template>
|
|
||||||
<div
|
|
||||||
id="app"
|
|
||||||
:key="String($store.state.instance.instanceUrl)"
|
|
||||||
:class="[$store.state.ui.queueFocused ? 'queue-focused' : '',
|
|
||||||
{'has-bottom-player': $store.state.queue.tracks.length > 0}]"
|
|
||||||
>
|
|
||||||
<!-- here, we display custom stylesheets, if any -->
|
|
||||||
<link
|
|
||||||
v-for="url in customStylesheets"
|
|
||||||
:key="url"
|
|
||||||
rel="stylesheet"
|
|
||||||
property="stylesheet"
|
|
||||||
:href="url"
|
|
||||||
>
|
|
||||||
<sidebar
|
|
||||||
:width="width"
|
|
||||||
@show:set-instance-modal="showSetInstanceModal = !showSetInstanceModal"
|
|
||||||
@show:shortcuts-modal="showShortcutsModal = !showShortcutsModal"
|
|
||||||
/>
|
|
||||||
<set-instance-modal
|
|
||||||
:show="showSetInstanceModal"
|
|
||||||
@update:show="showSetInstanceModal = $event"
|
|
||||||
/>
|
|
||||||
<service-messages />
|
|
||||||
<transition name="queue">
|
|
||||||
<queue
|
|
||||||
v-if="$store.state.ui.queueFocused"
|
|
||||||
@touch-progress="$refs.player.setCurrentTime($event)"
|
|
||||||
/>
|
|
||||||
</transition>
|
|
||||||
<router-view
|
|
||||||
role="main"
|
|
||||||
:class="{hidden: $store.state.ui.queueFocused}"
|
|
||||||
/>
|
|
||||||
<player ref="player" />
|
|
||||||
<playlist-modal v-if="$store.state.auth.authenticated" />
|
|
||||||
<channel-upload-modal v-if="$store.state.auth.authenticated" />
|
|
||||||
<filter-modal v-if="$store.state.auth.authenticated" />
|
|
||||||
<report-modal />
|
|
||||||
<shortcuts-modal
|
|
||||||
:show="showShortcutsModal"
|
|
||||||
@update:show="showShortcutsModal = $event"
|
|
||||||
/>
|
|
||||||
<GlobalEvents @keydown.h.exact="showShortcutsModal = !showShortcutsModal" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import axios from 'axios'
|
|
||||||
import { uniq, get } from 'lodash-es'
|
|
||||||
import { mapState, mapGetters } from 'vuex'
|
|
||||||
import { useWebSocket, whenever } from '@vueuse/core'
|
|
||||||
import GlobalEvents from '@/components/utils/global-events.vue'
|
|
||||||
import locales from './locales'
|
|
||||||
import { getClientOnlyRadio } from '@/radios'
|
|
||||||
|
|
||||||
import Player from '@/components/audio/Player.vue'
|
|
||||||
import Queue from '@/components/Queue.vue'
|
|
||||||
import PlaylistModal from '@/components/playlists/PlaylistModal.vue'
|
|
||||||
import ChannelUploadModal from '@/components/channels/UploadModal.vue'
|
|
||||||
import Sidebar from '@/components/Sidebar.vue'
|
|
||||||
import ServiceMessages from '@/components/ServiceMessages.vue'
|
|
||||||
import SetInstanceModal from '@/components/SetInstanceModal.vue'
|
|
||||||
import ShortcutsModal from '@/components/ShortcutsModal.vue'
|
|
||||||
import FilterModal from '@/components/moderation/FilterModal.vue'
|
|
||||||
import ReportModal from '@/components/moderation/ReportModal.vue'
|
|
||||||
import { watch, watchEffect } from '@vue/composition-api'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'App',
|
|
||||||
components: {
|
|
||||||
Player,
|
|
||||||
Queue,
|
|
||||||
PlaylistModal,
|
|
||||||
ChannelUploadModal,
|
|
||||||
Sidebar,
|
|
||||||
ServiceMessages,
|
|
||||||
SetInstanceModal,
|
|
||||||
ShortcutsModal,
|
|
||||||
FilterModal,
|
|
||||||
ReportModal,
|
|
||||||
GlobalEvents
|
|
||||||
},
|
|
||||||
setup (props, { root }) {
|
|
||||||
const store = root.$store
|
|
||||||
|
|
||||||
const url = store.getters['instance/absoluteUrl']('api/v1/activity')
|
|
||||||
.replace(/^http/, 'ws')
|
|
||||||
|
|
||||||
const { data, status, open, close } = useWebSocket(url, {
|
|
||||||
autoReconnect: true,
|
|
||||||
immediate: false
|
|
||||||
})
|
|
||||||
|
|
||||||
watch(() => store.state.auth.authenticated, (authenticated) => {
|
|
||||||
if (authenticated) return open()
|
|
||||||
close()
|
|
||||||
})
|
|
||||||
|
|
||||||
whenever(data, () => {
|
|
||||||
store.dispatch('ui/websocketEvent', JSON.parse(data.value))
|
|
||||||
})
|
|
||||||
|
|
||||||
watchEffect(() => {
|
|
||||||
console.log('Websocket status:', status.value)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
instanceUrl: null,
|
|
||||||
showShortcutsModal: false,
|
|
||||||
showSetInstanceModal: false,
|
|
||||||
initialTitle: document.title,
|
|
||||||
width: window.innerWidth
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState({
|
|
||||||
messages: state => state.ui.messages,
|
|
||||||
nodeinfo: state => state.instance.nodeinfo,
|
|
||||||
playing: state => state.player.playing,
|
|
||||||
bufferProgress: state => state.player.bufferProgress,
|
|
||||||
isLoadingAudio: state => state.player.isLoadingAudio,
|
|
||||||
serviceWorker: state => state.ui.serviceWorker
|
|
||||||
}),
|
|
||||||
...mapGetters({
|
|
||||||
hasNext: 'queue/hasNext',
|
|
||||||
currentTrack: 'queue/currentTrack',
|
|
||||||
progress: 'player/progress'
|
|
||||||
}),
|
|
||||||
labels () {
|
|
||||||
const play = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Play track')
|
|
||||||
const pause = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Pause track')
|
|
||||||
const next = this.$pgettext('Sidebar/Player/Icon.Tooltip', 'Next track')
|
|
||||||
const expandQueue = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Expand queue')
|
|
||||||
return {
|
|
||||||
play,
|
|
||||||
pause,
|
|
||||||
next,
|
|
||||||
expandQueue
|
|
||||||
}
|
|
||||||
},
|
|
||||||
suggestedInstances () {
|
|
||||||
const instances = this.$store.state.instance.knownInstances.slice(0)
|
|
||||||
if (this.$store.state.instance.frontSettings.defaultServerUrl) {
|
|
||||||
let serverUrl = this.$store.state.instance.frontSettings.defaultServerUrl
|
|
||||||
if (!serverUrl.endsWith('/')) {
|
|
||||||
serverUrl = serverUrl + '/'
|
|
||||||
}
|
|
||||||
instances.push(serverUrl)
|
|
||||||
}
|
|
||||||
instances.push(this.$store.getters['instance/defaultUrl'](), 'https://demo.funkwhale.audio/')
|
|
||||||
return uniq(instances.filter((e) => { return e }))
|
|
||||||
},
|
|
||||||
version () {
|
|
||||||
if (!this.nodeinfo) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return get(this.nodeinfo, 'software.version')
|
|
||||||
},
|
|
||||||
customStylesheets () {
|
|
||||||
if (this.$store.state.instance.frontSettings) {
|
|
||||||
return this.$store.state.instance.frontSettings.additionalStylesheets || []
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
},
|
|
||||||
matchDarkColorScheme () {
|
|
||||||
if (window.matchMedia) {
|
|
||||||
return window.matchMedia('(prefers-color-scheme: dark)')
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
'$store.state.instance.instanceUrl' (v) {
|
|
||||||
this.$store.dispatch('instance/fetchSettings')
|
|
||||||
this.fetchNodeInfo()
|
|
||||||
},
|
|
||||||
'$store.state.ui.theme': {
|
|
||||||
immediate: true,
|
|
||||||
handler (newValue) {
|
|
||||||
const matchesDark = this.matchDarkColorScheme
|
|
||||||
if (matchesDark) {
|
|
||||||
if (newValue === 'system') {
|
|
||||||
newValue = matchesDark.matches ? 'dark' : 'light'
|
|
||||||
matchesDark.addEventListener('change', this.handleThemeChange)
|
|
||||||
} else {
|
|
||||||
matchesDark.removeEventListener('change', this.handleThemeChange)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (newValue === 'system') {
|
|
||||||
newValue = 'light'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.setTheme(newValue)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'$store.state.ui.currentLanguage': {
|
|
||||||
immediate: true,
|
|
||||||
handler (newValue) {
|
|
||||||
const self = this
|
|
||||||
const htmlLocale = newValue.toLowerCase().replace('_', '-')
|
|
||||||
document.documentElement.setAttribute('lang', htmlLocale)
|
|
||||||
if (newValue === 'en_US') {
|
|
||||||
self.$language.current = 'noop'
|
|
||||||
self.$language.current = newValue
|
|
||||||
return self.$store.commit('ui/momentLocale', 'en')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
currentTrack: {
|
|
||||||
immediate: true,
|
|
||||||
handler (newValue) {
|
|
||||||
this.updateDocumentTitle()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'$store.state.ui.pageTitle': {
|
|
||||||
immediate: true,
|
|
||||||
handler (newValue) {
|
|
||||||
this.updateDocumentTitle()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'serviceWorker.updateAvailable': {
|
|
||||||
handler (v) {
|
|
||||||
if (!v) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const self = this
|
|
||||||
this.$store.commit('ui/addMessage', {
|
|
||||||
content: this.$pgettext('App/Message/Paragraph', 'A new version of the app is available.'),
|
|
||||||
date: new Date(),
|
|
||||||
key: 'refreshApp',
|
|
||||||
displayTime: 0,
|
|
||||||
classActions: 'bottom attached opaque',
|
|
||||||
actions: [
|
|
||||||
{
|
|
||||||
text: this.$pgettext('App/Message/Paragraph', 'Update'),
|
|
||||||
class: 'primary',
|
|
||||||
click: function () {
|
|
||||||
self.updateApp()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$pgettext('App/Message/Paragraph', 'Later'),
|
|
||||||
class: 'basic'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
},
|
|
||||||
immediate: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async created () {
|
|
||||||
if (navigator.serviceWorker) {
|
|
||||||
navigator.serviceWorker.addEventListener(
|
|
||||||
'controllerchange', () => {
|
|
||||||
if (this.serviceWorker.refreshing) return
|
|
||||||
this.$store.commit('ui/serviceWorker', {
|
|
||||||
refreshing: true
|
|
||||||
})
|
|
||||||
window.location.reload()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
window.addEventListener('resize', this.handleResize)
|
|
||||||
this.handleResize()
|
|
||||||
const self = this
|
|
||||||
if (!this.$store.state.ui.selectedLanguage) {
|
|
||||||
this.autodetectLanguage()
|
|
||||||
}
|
|
||||||
setInterval(() => {
|
|
||||||
// used to redraw ago dates every minute
|
|
||||||
self.$store.commit('ui/computeLastDate')
|
|
||||||
}, 1000 * 60)
|
|
||||||
const urlParams = new URLSearchParams(window.location.search)
|
|
||||||
const serverUrl = urlParams.get('_server')
|
|
||||||
if (serverUrl) {
|
|
||||||
this.$store.commit('instance/instanceUrl', serverUrl)
|
|
||||||
}
|
|
||||||
const url = urlParams.get('_url')
|
|
||||||
if (url) {
|
|
||||||
await this.$router.replace(url)
|
|
||||||
} else if (!this.$store.state.instance.instanceUrl) {
|
|
||||||
// we have several way to guess the API server url. By order of precedence:
|
|
||||||
// 1. use the url provided in settings.json, if any
|
|
||||||
// 2. use the url specified when building via VUE_APP_INSTANCE_URL
|
|
||||||
// 3. use the current url
|
|
||||||
const defaultInstanceUrl =
|
|
||||||
this.$store.state.instance.frontSettings.defaultServerUrl ||
|
|
||||||
import.meta.env.VUE_APP_INSTANCE_URL || this.$store.getters['instance/defaultUrl']()
|
|
||||||
this.$store.commit('instance/instanceUrl', defaultInstanceUrl)
|
|
||||||
} else {
|
|
||||||
// needed to trigger initialization of axios / service worker
|
|
||||||
this.$store.commit('instance/instanceUrl', this.$store.state.instance.instanceUrl)
|
|
||||||
}
|
|
||||||
await this.fetchNodeInfo()
|
|
||||||
this.$store.dispatch('instance/fetchSettings')
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'inbox.item_added',
|
|
||||||
id: 'sidebarCount',
|
|
||||||
handler: this.incrementNotificationCountInSidebar
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'mutation.created',
|
|
||||||
id: 'sidebarReviewEditCount',
|
|
||||||
handler: this.incrementReviewEditCountInSidebar
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'mutation.updated',
|
|
||||||
id: 'sidebarReviewEditCount',
|
|
||||||
handler: this.incrementReviewEditCountInSidebar
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'report.created',
|
|
||||||
id: 'sidebarPendingReviewReportCount',
|
|
||||||
handler: this.incrementPendingReviewReportsCountInSidebar
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'user_request.created',
|
|
||||||
id: 'sidebarPendingReviewRequestCount',
|
|
||||||
handler: this.incrementPendingReviewRequestsCountInSidebar
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/addWebsocketEventHandler', {
|
|
||||||
eventName: 'Listen',
|
|
||||||
id: 'handleListen',
|
|
||||||
handler: this.handleListen
|
|
||||||
})
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
const self = this
|
|
||||||
// slight hack to allow use to have internal links in <translate> tags
|
|
||||||
// while preserving router behaviour
|
|
||||||
document.documentElement.addEventListener('click', function (event) {
|
|
||||||
if (!event.target.matches('a.internal')) return
|
|
||||||
self.$router.push(event.target.getAttribute('href'))
|
|
||||||
event.preventDefault()
|
|
||||||
}, false)
|
|
||||||
this.$nextTick(() => {
|
|
||||||
document.getElementById('fake-content').classList.add('loaded')
|
|
||||||
})
|
|
||||||
},
|
|
||||||
destroyed () {
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'inbox.item_added',
|
|
||||||
id: 'sidebarCount'
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'mutation.created',
|
|
||||||
id: 'sidebarReviewEditCount'
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'mutation.updated',
|
|
||||||
id: 'sidebarReviewEditCount'
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'mutation.updated',
|
|
||||||
id: 'sidebarPendingReviewReportCount'
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'user_request.created',
|
|
||||||
id: 'sidebarPendingReviewRequestCount'
|
|
||||||
})
|
|
||||||
this.$store.commit('ui/removeWebsocketEventHandler', {
|
|
||||||
eventName: 'Listen',
|
|
||||||
id: 'handleListen'
|
|
||||||
})
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
incrementNotificationCountInSidebar (event) {
|
|
||||||
this.$store.commit('ui/incrementNotifications', { type: 'inbox', count: 1 })
|
|
||||||
},
|
|
||||||
incrementReviewEditCountInSidebar (event) {
|
|
||||||
this.$store.commit('ui/incrementNotifications', { type: 'pendingReviewEdits', value: event.pending_review_count })
|
|
||||||
},
|
|
||||||
incrementPendingReviewReportsCountInSidebar (event) {
|
|
||||||
this.$store.commit('ui/incrementNotifications', { type: 'pendingReviewReports', value: event.unresolved_count })
|
|
||||||
},
|
|
||||||
incrementPendingReviewRequestsCountInSidebar (event) {
|
|
||||||
this.$store.commit('ui/incrementNotifications', { type: 'pendingReviewRequests', value: event.pending_count })
|
|
||||||
},
|
|
||||||
handleListen (event) {
|
|
||||||
if (this.$store.state.radios.current && this.$store.state.radios.running) {
|
|
||||||
const current = this.$store.state.radios.current
|
|
||||||
if (current.clientOnly && current.type === 'account') {
|
|
||||||
getClientOnlyRadio(current).handleListen(current, event, this.$store)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async fetchNodeInfo () {
|
|
||||||
const response = await axios.get('instance/nodeinfo/2.0/')
|
|
||||||
this.$store.commit('instance/nodeinfo', response.data)
|
|
||||||
},
|
|
||||||
autodetectLanguage () {
|
|
||||||
const userLanguage = navigator.language || navigator.userLanguage
|
|
||||||
const available = locales.locales.map(e => { return e.code })
|
|
||||||
let candidate
|
|
||||||
const matching = available.filter((a) => {
|
|
||||||
return userLanguage.replace('-', '_') === a
|
|
||||||
})
|
|
||||||
const almostMatching = available.filter((a) => {
|
|
||||||
return userLanguage.replace('-', '_').split('_')[0] === a.split('_')[0]
|
|
||||||
})
|
|
||||||
if (matching.length > 0) {
|
|
||||||
candidate = matching[0]
|
|
||||||
} else if (almostMatching.length > 0) {
|
|
||||||
candidate = almostMatching[0]
|
|
||||||
} else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.$store.commit('ui/currentLanguage', candidate)
|
|
||||||
},
|
|
||||||
getTrackInformationText (track) {
|
|
||||||
const trackTitle = track.title
|
|
||||||
const albumArtist = (track.album) ? track.album.artist.name : null
|
|
||||||
const artistName = (
|
|
||||||
(track.artist) ? track.artist.name : albumArtist)
|
|
||||||
const text = `♫ ${trackTitle} – ${artistName} ♫`
|
|
||||||
return text
|
|
||||||
},
|
|
||||||
updateDocumentTitle () {
|
|
||||||
const parts = []
|
|
||||||
const currentTrackPart = (
|
|
||||||
(this.currentTrack)
|
|
||||||
? this.getTrackInformationText(this.currentTrack)
|
|
||||||
: null)
|
|
||||||
if (currentTrackPart) {
|
|
||||||
parts.push(currentTrackPart)
|
|
||||||
}
|
|
||||||
if (this.$store.state.ui.pageTitle) {
|
|
||||||
parts.push(this.$store.state.ui.pageTitle)
|
|
||||||
}
|
|
||||||
parts.push(this.initialTitle || 'Funkwhale')
|
|
||||||
document.title = parts.join(' – ')
|
|
||||||
},
|
|
||||||
|
|
||||||
updateApp () {
|
|
||||||
this.$store.commit('ui/serviceWorker', { updateAvailable: false })
|
|
||||||
if (!this.serviceWorker.registration || !this.serviceWorker.registration.waiting) { return }
|
|
||||||
this.serviceWorker.registration.waiting.postMessage({ command: 'skipWaiting' })
|
|
||||||
},
|
|
||||||
handleResize () {
|
|
||||||
this.width = window.innerWidth
|
|
||||||
},
|
|
||||||
handleThemeChange (event) {
|
|
||||||
this.setTheme(event.matches ? 'dark' : 'light')
|
|
||||||
},
|
|
||||||
setTheme (theme) {
|
|
||||||
const oldTheme = (theme === 'light') ? 'dark' : 'light'
|
|
||||||
document.body.classList.remove(`theme-${oldTheme}`)
|
|
||||||
document.body.classList.add(`theme-${theme}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
@import "style/_main";
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,163 +0,0 @@
|
||||||
// generated by unplugin-vue-components
|
|
||||||
// We suggest you to commit this file into source control
|
|
||||||
// Read more: https://github.com/vuejs/vue-next/pull/3399
|
|
||||||
|
|
||||||
declare module '@vue/runtime-core' {
|
|
||||||
export interface GlobalComponents {
|
|
||||||
About: typeof import('./components/About.vue')['default']
|
|
||||||
AboutPod: typeof import('./components/AboutPod.vue')['default']
|
|
||||||
AccountsTable: typeof import('./components/manage/moderation/AccountsTable.vue')['default']
|
|
||||||
ActionFeedback: typeof import('./components/common/ActionFeedback.vue')['default']
|
|
||||||
ActionTable: typeof import('./components/common/ActionTable.vue')['default']
|
|
||||||
ActorAvatar: typeof import('./components/common/ActorAvatar.vue')['default']
|
|
||||||
ActorLink: typeof import('./components/common/ActorLink.vue')['default']
|
|
||||||
AjaxButton: typeof import('./components/common/AjaxButton.vue')['default']
|
|
||||||
AlbumBase: typeof import('./components/library/AlbumBase.vue')['default']
|
|
||||||
AlbumDetail: typeof import('./components/library/AlbumDetail.vue')['default']
|
|
||||||
AlbumDropdown: typeof import('./components/library/AlbumDropdown.vue')['default']
|
|
||||||
AlbumEdit: typeof import('./components/library/AlbumEdit.vue')['default']
|
|
||||||
AlbumForm: typeof import('./components/channels/AlbumForm.vue')['default']
|
|
||||||
AlbumModal: typeof import('./components/channels/AlbumModal.vue')['default']
|
|
||||||
Albums: typeof import('./components/library/Albums.vue')['default']
|
|
||||||
AlbumSelect: typeof import('./components/channels/AlbumSelect.vue')['default']
|
|
||||||
AlbumsTable: typeof import('./components/manage/library/AlbumsTable.vue')['default']
|
|
||||||
ApplicationEdit: typeof import('./components/auth/ApplicationEdit.vue')['default']
|
|
||||||
ApplicationForm: typeof import('./components/auth/ApplicationForm.vue')['default']
|
|
||||||
ApplicationNew: typeof import('./components/auth/ApplicationNew.vue')['default']
|
|
||||||
ArtistBase: typeof import('./components/library/ArtistBase.vue')['default']
|
|
||||||
ArtistDetail: typeof import('./components/library/ArtistDetail.vue')['default']
|
|
||||||
ArtistEdit: typeof import('./components/library/ArtistEdit.vue')['default']
|
|
||||||
ArtistLabel: typeof import('./components/audio/ArtistLabel.vue')['default']
|
|
||||||
Artists: typeof import('./components/library/Artists.vue')['default']
|
|
||||||
ArtistsTable: typeof import('./components/manage/library/ArtistsTable.vue')['default']
|
|
||||||
AttachmentInput: typeof import('./components/common/AttachmentInput.vue')['default']
|
|
||||||
Authorize: typeof import('./components/auth/Authorize.vue')['default']
|
|
||||||
Builder: typeof import('./components/library/radios/Builder.vue')['default']
|
|
||||||
Button: typeof import('./components/radios/Button.vue')['default']
|
|
||||||
Card: typeof import('./components/playlists/Card.vue')['default']
|
|
||||||
CardList: typeof import('./components/playlists/CardList.vue')['default']
|
|
||||||
ChannelCard: typeof import('./components/audio/ChannelCard.vue')['default']
|
|
||||||
ChannelEntries: typeof import('./components/audio/ChannelEntries.vue')['default']
|
|
||||||
ChannelEntryCard: typeof import('./components/audio/ChannelEntryCard.vue')['default']
|
|
||||||
ChannelForm: typeof import('./components/audio/ChannelForm.vue')['default']
|
|
||||||
ChannelSerieCard: typeof import('./components/audio/ChannelSerieCard.vue')['default']
|
|
||||||
ChannelSeries: typeof import('./components/audio/ChannelSeries.vue')['default']
|
|
||||||
ChannelsTable: typeof import('./components/manage/ChannelsTable.vue')['default']
|
|
||||||
ChannelsWidget: typeof import('./components/audio/ChannelsWidget.vue')['default']
|
|
||||||
CollapseLink: typeof import('./components/common/CollapseLink.vue')['default']
|
|
||||||
ContentForm: typeof import('./components/common/ContentForm.vue')['default']
|
|
||||||
CopyInput: typeof import('./components/common/CopyInput.vue')['default']
|
|
||||||
DangerousButton: typeof import('./components/common/DangerousButton.vue')['default']
|
|
||||||
DomainsTable: typeof import('./components/manage/moderation/DomainsTable.vue')['default']
|
|
||||||
Duration: typeof import('./components/common/Duration.vue')['default']
|
|
||||||
EditCard: typeof import('./components/library/EditCard.vue')['default']
|
|
||||||
EditDetail: typeof import('./components/library/EditDetail.vue')['default']
|
|
||||||
EditForm: typeof import('./components/library/EditForm.vue')['default']
|
|
||||||
EditList: typeof import('./components/library/EditList.vue')['default']
|
|
||||||
Editor: typeof import('./components/playlists/Editor.vue')['default']
|
|
||||||
EditsCardList: typeof import('./components/manage/library/EditsCardList.vue')['default']
|
|
||||||
EmbedWizard: typeof import('./components/audio/EmbedWizard.vue')['default']
|
|
||||||
EmptyState: typeof import('./components/common/EmptyState.vue')['default']
|
|
||||||
ExpandableDiv: typeof import('./components/common/ExpandableDiv.vue')['default']
|
|
||||||
FetchButton: typeof import('./components/federation/FetchButton.vue')['default']
|
|
||||||
FileUpload: typeof import('./components/library/FileUpload.vue')['default']
|
|
||||||
FileUploadWidget: typeof import('./components/library/FileUploadWidget.vue')['default']
|
|
||||||
Filter: typeof import('./components/library/radios/Filter.vue')['default']
|
|
||||||
FilterModal: typeof import('./components/moderation/FilterModal.vue')['default']
|
|
||||||
Footer: typeof import('./components/Footer.vue')['default']
|
|
||||||
Form: typeof import('./components/playlists/Form.vue')['default']
|
|
||||||
FsBrowser: typeof import('./components/library/FsBrowser.vue')['default']
|
|
||||||
FsLogs: typeof import('./components/library/FsLogs.vue')['default']
|
|
||||||
GlobalEvents: typeof import('./components/utils/global-events.vue')['default']
|
|
||||||
Home: typeof import('./components/Home.vue')['default']
|
|
||||||
HumanDate: typeof import('./components/common/HumanDate.vue')['default']
|
|
||||||
HumanDuration: typeof import('./components/common/HumanDuration.vue')['default']
|
|
||||||
ImportStatusModal: typeof import('./components/library/ImportStatusModal.vue')['default']
|
|
||||||
InlineSearchBar: typeof import('./components/common/InlineSearchBar.vue')['default']
|
|
||||||
InstancePolicyCard: typeof import('./components/manage/moderation/InstancePolicyCard.vue')['default']
|
|
||||||
InstancePolicyForm: typeof import('./components/manage/moderation/InstancePolicyForm.vue')['default']
|
|
||||||
InstancePolicyModal: typeof import('./components/manage/moderation/InstancePolicyModal.vue')['default']
|
|
||||||
InvitationForm: typeof import('./components/manage/users/InvitationForm.vue')['default']
|
|
||||||
InvitationsTable: typeof import('./components/manage/users/InvitationsTable.vue')['default']
|
|
||||||
LibrariesTable: typeof import('./components/manage/library/LibrariesTable.vue')['default']
|
|
||||||
Library: typeof import('./components/library/Library.vue')['default']
|
|
||||||
LibraryFollowButton: typeof import('./components/audio/LibraryFollowButton.vue')['default']
|
|
||||||
LibraryWidget: typeof import('./components/federation/LibraryWidget.vue')['default']
|
|
||||||
LicenseSelect: typeof import('./components/channels/LicenseSelect.vue')['default']
|
|
||||||
List: typeof import('./components/favorites/List.vue')['default']
|
|
||||||
LoginForm: typeof import('./components/auth/LoginForm.vue')['default']
|
|
||||||
LoginModal: typeof import('./components/common/LoginModal.vue')['default']
|
|
||||||
Logo: typeof import('./components/Logo.vue')['default']
|
|
||||||
LogoText: typeof import('./components/LogoText.vue')['default']
|
|
||||||
Logout: typeof import('./components/auth/Logout.vue')['default']
|
|
||||||
Message: typeof import('./components/common/Message.vue')['default']
|
|
||||||
MobileRow: typeof import('./components/audio/podcast/MobileRow.vue')['default']
|
|
||||||
Modal: typeof import('./components/semantic/Modal.vue')['default']
|
|
||||||
NoteForm: typeof import('./components/manage/moderation/NoteForm.vue')['default']
|
|
||||||
NotesThread: typeof import('./components/manage/moderation/NotesThread.vue')['default']
|
|
||||||
NotificationRow: typeof import('./components/notifications/NotificationRow.vue')['default']
|
|
||||||
Ordering: typeof import('./components/mixins/Ordering.vue')['default']
|
|
||||||
PageNotFound: typeof import('./components/PageNotFound.vue')['default']
|
|
||||||
Pagination: typeof import('./components/Pagination.vue')['default']
|
|
||||||
PasswordInput: typeof import('./components/forms/PasswordInput.vue')['default']
|
|
||||||
PlayButton: typeof import('./components/audio/PlayButton.vue')['default']
|
|
||||||
Player: typeof import('./components/audio/Player.vue')['default']
|
|
||||||
PlayIndicator: typeof import('./components/audio/track/PlayIndicator.vue')['default']
|
|
||||||
PlaylistModal: typeof import('./components/playlists/PlaylistModal.vue')['default']
|
|
||||||
PlayOptions: typeof import('./components/mixins/PlayOptions.vue')['default']
|
|
||||||
Plugin: typeof import('./components/auth/Plugin.vue')['default']
|
|
||||||
Podcasts: typeof import('./components/library/Podcasts.vue')['default']
|
|
||||||
Queue: typeof import('./components/Queue.vue')['default']
|
|
||||||
Radios: typeof import('./components/library/Radios.vue')['default']
|
|
||||||
RemoteSearchForm: typeof import('./components/RemoteSearchForm.vue')['default']
|
|
||||||
RenderedDescription: typeof import('./components/common/RenderedDescription.vue')['default']
|
|
||||||
Report: typeof import('./components/mixins/Report.vue')['default']
|
|
||||||
ReportCard: typeof import('./components/manage/moderation/ReportCard.vue')['default']
|
|
||||||
ReportCategoryDropdown: typeof import('./components/moderation/ReportCategoryDropdown.vue')['default']
|
|
||||||
ReportModal: typeof import('./components/moderation/ReportModal.vue')['default']
|
|
||||||
RouterLink: typeof import('vue-router')['RouterLink']
|
|
||||||
RouterView: typeof import('vue-router')['RouterView']
|
|
||||||
Row: typeof import('./components/audio/podcast/Row.vue')['default']
|
|
||||||
Search: typeof import('./components/audio/Search.vue')['default']
|
|
||||||
SearchBar: typeof import('./components/audio/SearchBar.vue')['default']
|
|
||||||
ServiceMessages: typeof import('./components/ServiceMessages.vue')['default']
|
|
||||||
SetInstanceModal: typeof import('./components/SetInstanceModal.vue')['default']
|
|
||||||
Settings: typeof import('./components/auth/Settings.vue')['default']
|
|
||||||
SettingsGroup: typeof import('./components/admin/SettingsGroup.vue')['default']
|
|
||||||
ShortcutsModal: typeof import('./components/ShortcutsModal.vue')['default']
|
|
||||||
Sidebar: typeof import('./components/Sidebar.vue')['default']
|
|
||||||
SignupForm: typeof import('./components/auth/SignupForm.vue')['default']
|
|
||||||
SignupFormBuilder: typeof import('./components/admin/SignupFormBuilder.vue')['default']
|
|
||||||
SmartSearch: typeof import('./components/mixins/SmartSearch.vue')['default']
|
|
||||||
SubscribeButton: typeof import('./components/channels/SubscribeButton.vue')['default']
|
|
||||||
SubsonicTokenForm: typeof import('./components/auth/SubsonicTokenForm.vue')['default']
|
|
||||||
Table: typeof import('./components/audio/podcast/Table.vue')['default']
|
|
||||||
TagDetail: typeof import('./components/library/TagDetail.vue')['default']
|
|
||||||
TagsSelector: typeof import('./components/library/TagsSelector.vue')['default']
|
|
||||||
TagsTable: typeof import('./components/manage/library/TagsTable.vue')['default']
|
|
||||||
Themes: typeof import('./components/mixins/Themes.vue')['default']
|
|
||||||
Tooltip: typeof import('./components/common/Tooltip.vue')['default']
|
|
||||||
TrackBase: typeof import('./components/library/TrackBase.vue')['default']
|
|
||||||
TrackDetail: typeof import('./components/library/TrackDetail.vue')['default']
|
|
||||||
TrackEdit: typeof import('./components/library/TrackEdit.vue')['default']
|
|
||||||
TrackFavoriteIcon: typeof import('./components/favorites/TrackFavoriteIcon.vue')['default']
|
|
||||||
TrackPlaylistIcon: typeof import('./components/playlists/TrackPlaylistIcon.vue')['default']
|
|
||||||
TracksTable: typeof import('./components/manage/library/TracksTable.vue')['default']
|
|
||||||
Translations: typeof import('./components/mixins/Translations.vue')['default']
|
|
||||||
UploadDetail: typeof import('./components/library/UploadDetail.vue')['default']
|
|
||||||
UploadForm: typeof import('./components/channels/UploadForm.vue')['default']
|
|
||||||
UploadMetadataForm: typeof import('./components/channels/UploadMetadataForm.vue')['default']
|
|
||||||
UploadModal: typeof import('./components/channels/UploadModal.vue')['default']
|
|
||||||
UploadsTable: typeof import('./components/manage/library/UploadsTable.vue')['default']
|
|
||||||
UserLink: typeof import('./components/common/UserLink.vue')['default']
|
|
||||||
UserMenu: typeof import('./components/common/UserMenu.vue')['default']
|
|
||||||
UserModal: typeof import('./components/common/UserModal.vue')['default']
|
|
||||||
Username: typeof import('./components/common/Username.vue')['default']
|
|
||||||
UserRequestCard: typeof import('./components/manage/moderation/UserRequestCard.vue')['default']
|
|
||||||
UsersTable: typeof import('./components/manage/users/UsersTable.vue')['default']
|
|
||||||
VolumeControl: typeof import('./components/audio/VolumeControl.vue')['default']
|
|
||||||
Widget: typeof import('./components/playlists/Widget.vue')['default']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { }
|
|
Loading…
Reference in New Issue