Fix radio button

This commit is contained in:
wvffle 2022-07-19 02:09:16 +00:00 committed by Georg Krause
parent 58ef3757a4
commit 7408fe17ec
5 changed files with 79 additions and 64 deletions

View File

@ -10,14 +10,15 @@ interface Props {
type?: string type?: string
clientOnly?: boolean clientOnly?: boolean
objectId?: ObjectId | null objectId?: ObjectId | null
radioConfig: RadioConfig radioConfig?: RadioConfig | null
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
customRadioId: null, customRadioId: null,
type: '', type: '',
clientOnly: false, clientOnly: false,
objectId: null objectId: null,
radioConfig: null
}) })
const store = useStore() const store = useStore()
@ -33,7 +34,7 @@ const running = computed(() => {
const { $pgettext } = useGettext() const { $pgettext } = useGettext()
const buttonLabel = computed(() => { const buttonLabel = computed(() => {
switch (props.radioConfig.type) { switch (props.radioConfig?.type) {
case 'tag': case 'tag':
return running.value return running.value
? $pgettext('*/Player/Button.Label/Short, Verb', 'Stop tags radio') ? $pgettext('*/Player/Button.Label/Short, Verb', 'Stop tags radio')

View File

@ -26,7 +26,8 @@ export default [
defaultTags: Array.isArray(route.query.tag || []) defaultTags: Array.isArray(route.query.tag || [])
? route.query.tag ? route.query.tag
: [route.query.tag], : [route.query.tag],
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -40,7 +41,8 @@ export default [
defaultTags: Array.isArray(route.query.tag || []) defaultTags: Array.isArray(route.query.tag || [])
? route.query.tag ? route.query.tag
: [route.query.tag], : [route.query.tag],
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -53,7 +55,8 @@ export default [
defaultTags: Array.isArray(route.query.tag || []) defaultTags: Array.isArray(route.query.tag || [])
? route.query.tag ? route.query.tag
: [route.query.tag], : [route.query.tag],
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -66,7 +69,8 @@ export default [
defaultTags: Array.isArray(route.query.tag || []) defaultTags: Array.isArray(route.query.tag || [])
? route.query.tag ? route.query.tag
: [route.query.tag], : [route.query.tag],
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -80,7 +84,8 @@ export default [
defaultTags: Array.isArray(route.query.tag || []) defaultTags: Array.isArray(route.query.tag || [])
? route.query.tag ? route.query.tag
: [route.query.tag], : [route.query.tag],
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -90,7 +95,8 @@ export default [
props: route => ({ props: route => ({
defaultOrdering: route.query.ordering, defaultOrdering: route.query.ordering,
defaultQuery: route.query.query, defaultQuery: route.query.query,
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -101,7 +107,8 @@ export default [
scope: 'me', scope: 'me',
defaultOrdering: route.query.ordering, defaultOrdering: route.query.ordering,
defaultQuery: route.query.query, defaultQuery: route.query.query,
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -129,7 +136,8 @@ export default [
props: route => ({ props: route => ({
defaultOrdering: route.query.ordering, defaultOrdering: route.query.ordering,
defaultQuery: route.query.query, defaultQuery: route.query.query,
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {
@ -140,7 +148,8 @@ export default [
scope: 'me', scope: 'me',
defaultOrdering: route.query.ordering, defaultOrdering: route.query.ordering,
defaultQuery: route.query.query, defaultQuery: route.query.query,
defaultPage: route.query.page ? +route.query.page : undefined defaultPage: route.query.page ? +route.query.page : undefined,
orderingConfigName: null
}) })
}, },
{ {

View File

@ -143,6 +143,9 @@ export interface LibraryScan {
export interface LibraryFollow { export interface LibraryFollow {
uuid: string uuid: string
approved: boolean approved: boolean
// TODO (wvffle): Check if it's not added only on frontend side
isLoading?: boolean
} }
export interface Cover { export interface Cover {

View File

@ -8,6 +8,7 @@ import TrackTable from '~/components/audio/track/Table.vue'
import Pagination from '~/components/vui/Pagination.vue' import Pagination from '~/components/vui/Pagination.vue'
import PlaylistCardList from '~/components/playlists/CardList.vue' import PlaylistCardList from '~/components/playlists/CardList.vue'
import RadioCard from '~/components/radios/Card.vue' import RadioCard from '~/components/radios/Card.vue'
import RadioButton from '~/components/radios/Button.vue'
import TagsList from '~/components/tags/List.vue' import TagsList from '~/components/tags/List.vue'
import { ref, reactive, computed, watch } from 'vue' import { ref, reactive, computed, watch } from 'vue'
import { useRouter, onBeforeRouteUpdate } from 'vue-router' import { useRouter, onBeforeRouteUpdate } from 'vue-router'

View File

@ -1,3 +1,51 @@
<script setup lang="ts">
import type { Library, LibraryFollow } from '~/types'
import LibraryFilesTable from '~/views/content/libraries/FilesTable.vue'
import LibraryForm from '~/views/content/libraries/Form.vue'
import { ref } from 'vue'
import axios from 'axios'
interface Props {
object: Library
}
const props = defineProps<Props>()
type ResponseType = { count: number, results: any[] }
const follows = ref<ResponseType | null>(null)
const isLoading = ref(false)
const fetchData = async () => {
isLoading.value = true
try {
const response = await axios.get(`libraries/${props.object.uuid}/follows/`)
follows.value = response.data
} catch (error) {
// TODO (wvffle): Handle error
}
isLoading.value = false
}
fetchData()
// TODO (wvffle): Find correct type
const updateApproved = async (follow: LibraryFollow, approved: boolean) => {
follow.isLoading = true
try {
await axios.post(`federation/follows/library/${follow.uuid}/${approved ? 'accept' : 'reject'}/`)
follow.approved = approved
} catch (error) {
// TODO (wvffle): Handle error
}
follow.isLoading = false
}
</script>
<template> <template>
<section> <section>
<library-form <library-form
@ -11,7 +59,7 @@
Library contents Library contents
</translate> </translate>
</h2> </h2>
<library-files-table :filters="{library: object.uuid}" /> <library-files-table :filters="{library: object.uuid}" :ordering-config-name="null" />
<div class="ui hidden divider" /> <div class="ui hidden divider" />
<h2 class="ui header"> <h2 class="ui header">
@ -20,8 +68,8 @@
</translate> </translate>
</h2> </h2>
<div <div
v-if="isLoadingFollows" v-if="isLoading"
:class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']"
> >
<div class="ui text loader"> <div class="ui text loader">
<translate translate-context="Content/Library/Paragraph"> <translate translate-context="Content/Library/Paragraph">
@ -30,7 +78,7 @@
</div> </div>
</div> </div>
<table <table
v-else-if="follows && follows.count > 0" v-else-if="follows?.count > 0"
class="ui table" class="ui table"
> >
<thead> <thead>
@ -58,7 +106,7 @@
</tr> </tr>
</thead> </thead>
<tr <tr
v-for="follow in follows.results" v-for="follow in follows?.results ?? []"
:key="follow.fid" :key="follow.fid"
> >
<td><actor-link :actor="follow.actor" /></td> <td><actor-link :actor="follow.actor" /></td>
@ -112,50 +160,3 @@
</p> </p>
</section> </section>
</template> </template>
<script>
import LibraryFilesTable from '~/views/content/libraries/FilesTable.vue'
import LibraryForm from '~/views/content/libraries/Form.vue'
import axios from 'axios'
export default {
components: {
LibraryForm,
LibraryFilesTable
},
props: { object: { type: String, required: true } },
data () {
return {
isLoadingFollows: false,
follows: null
}
},
created () {
this.fetchFollows()
},
methods: {
fetchFollows () {
const self = this
self.isLoadingLibrary = true
axios.get(`libraries/${this.object.uuid}/follows/`).then(response => {
self.follows = response.data
self.isLoadingFollows = false
})
},
updateApproved (follow, value) {
let action
if (value) {
action = 'accept'
} else {
action = 'reject'
}
axios
.post(`federation/follows/library/${follow.uuid}/${action}/`)
.then(response => {
follow.isLoading = false
follow.approved = value
})
}
}
}
</script>