[WIP] replace buttons with new ui component
This commit is contained in:
parent
5399f9be0e
commit
5eef4692e1
|
@ -9,6 +9,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import AlbumCard from '~/components/album/Card.vue'
|
import AlbumCard from '~/components/album/Card.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
|
@ -111,13 +112,12 @@ watch(
|
||||||
</slot>
|
</slot>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.audio.album.Widget.button.more') }}
|
{{ t('components.audio.album.Widget.button.more') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import ArtistCard from '~/components/artist/Card.vue'
|
import ArtistCard from '~/components/artist/Card.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
|
@ -107,13 +108,12 @@ watch(
|
||||||
</slot>
|
</slot>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.audio.artist.Widget.button.more') }}
|
{{ t('components.audio.artist.Widget.button.more') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import ChannelSerieCard from '~/components/audio/ChannelSerieCard.vue'
|
import ChannelSerieCard from '~/components/audio/ChannelSerieCard.vue'
|
||||||
import AlbumCard from '~/components/audio/album/Card.vue'
|
import AlbumCard from '~/components/audio/album/Card.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
filters: object
|
filters: object
|
||||||
|
@ -82,13 +83,12 @@ fetchData()
|
||||||
</div>
|
</div>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.audio.ChannelSeries.button.showMore') }}
|
{{ t('components.audio.ChannelSeries.button.showMore') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!isLoading && albums.length === 0">
|
<template v-if="!isLoading && albums.length === 0">
|
||||||
<empty-state
|
<empty-state
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import ChannelCard from '~/components/audio/ChannelCard.vue'
|
import ChannelCard from '~/components/audio/ChannelCard.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Events {
|
interface Events {
|
||||||
(e: 'fetched', channels: BackendResponse<Channel>): void
|
(e: 'fetched', channels: BackendResponse<Channel>): void
|
||||||
|
@ -75,13 +76,12 @@ fetchData()
|
||||||
</div>
|
</div>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.audio.ChannelsWidget.button.showMore') }}
|
{{ t('components.audio.ChannelsWidget.button.showMore') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!isLoading && channels.length === 0">
|
<template v-if="!isLoading && channels.length === 0">
|
||||||
<empty-state
|
<empty-state
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import useWebSocketHandler from '~/composables/useWebSocketHandler'
|
import useWebSocketHandler from '~/composables/useWebSocketHandler'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
import PlayButton from '~/components/audio/PlayButton.vue'
|
import PlayButton from '~/components/audio/PlayButton.vue'
|
||||||
import TagsList from '~/components/tags/List.vue'
|
import TagsList from '~/components/tags/List.vue'
|
||||||
|
|
||||||
|
@ -219,12 +220,11 @@ watch(() => props.websocketHandlers.includes('Listen'), (to) => {
|
||||||
</div>
|
</div>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage as string)"
|
@click="fetchData(nextPage as string)"
|
||||||
>
|
>
|
||||||
{{ t('components.audio.track.Widget.button.more') }}
|
{{ t('components.audio.track.Widget.button.more') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { ref, computed } from 'vue'
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
import useScopes from '~/composables/auth/useScopes'
|
import useScopes from '~/composables/auth/useScopes'
|
||||||
import useFormData from '~/composables/useFormData'
|
import useFormData from '~/composables/useFormData'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
clientId: string
|
clientId: string
|
||||||
|
@ -204,13 +205,12 @@ whenever(() => props.clientId, fetchApplication, { immediate: true })
|
||||||
<li>{{ unknownscope }}</li>
|
<li>{{ unknownscope }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<Button
|
||||||
class="ui success labeled icon button"
|
icon="bi-unlock"
|
||||||
type="submit"
|
type="submit"
|
||||||
>
|
>
|
||||||
<i class="lock open icon" />
|
|
||||||
{{ t('components.auth.Authorize.button.authorize', { app: application.name }) }}
|
{{ t('components.auth.Authorize.button.authorize', { app: application.name }) }}
|
||||||
</button>
|
</Button>
|
||||||
<p
|
<p
|
||||||
v-if="redirectUri === 'urn:ietf:wg:oauth:2.0:oob'"
|
v-if="redirectUri === 'urn:ietf:wg:oauth:2.0:oob'"
|
||||||
>
|
>
|
||||||
|
|
|
@ -3,6 +3,8 @@ import { computed } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { useStore } from '~/store'
|
import { useStore } from '~/store'
|
||||||
|
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
@ -27,12 +29,11 @@ const labels = computed(() => ({
|
||||||
<p>
|
<p>
|
||||||
{{ t('components.auth.Logout.message.loggedIn', { username: store.state.auth.username }) }}
|
{{ t('components.auth.Logout.message.loggedIn', { username: store.state.auth.username }) }}
|
||||||
</p>
|
</p>
|
||||||
<button
|
<Button
|
||||||
class="ui button"
|
|
||||||
@click="store.dispatch('auth/logout')"
|
@click="store.dispatch('auth/logout')"
|
||||||
>
|
>
|
||||||
{{ t('components.auth.Logout.button.logout') }}
|
{{ t('components.auth.Logout.button.logout') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Events {
|
interface Events {
|
||||||
(e: 'refresh'): void
|
(e: 'refresh'): void
|
||||||
|
@ -30,13 +31,12 @@ withDefaults(defineProps<Props>(), {
|
||||||
</h4>
|
</h4>
|
||||||
<div class="inline center aligned text">
|
<div class="inline center aligned text">
|
||||||
<slot />
|
<slot />
|
||||||
<button
|
<Button
|
||||||
v-if="refresh"
|
v-if="refresh"
|
||||||
class="ui button"
|
|
||||||
@click="emit('refresh')"
|
@click="emit('refresh')"
|
||||||
>
|
>
|
||||||
{{ t('components.common.EmptyState.button.refresh') }}
|
{{ t('components.common.EmptyState.button.refresh') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -3,6 +3,7 @@ import type { BackendError } from '~/types'
|
||||||
|
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
import { useTimeoutFn } from '@vueuse/core'
|
import { useTimeoutFn } from '@vueuse/core'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
@ -212,16 +213,15 @@ const { start: startPolling } = useTimeoutFn(poll, 1000, { immediate: false })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui basic cancel button">
|
<Button color="secondary">
|
||||||
{{ t('components.federation.FetchButton.button.close') }}
|
{{ t('components.federation.FetchButton.button.close') }}
|
||||||
</button>
|
</Button>
|
||||||
<button
|
<Button
|
||||||
v-if="data && data.status === 'finished'"
|
v-if="data && data.status === 'finished'"
|
||||||
class="ui confirm success button"
|
|
||||||
@click.prevent="showModal = false; emit('refresh')"
|
@click.prevent="showModal = false; emit('refresh')"
|
||||||
>
|
>
|
||||||
{{ t('components.federation.FetchButton.button.reload') }}
|
{{ t('components.federation.FetchButton.button.reload') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import LibraryCard from '~/views/content/remote/Card.vue'
|
import LibraryCard from '~/views/content/remote/Card.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
|
@ -90,13 +91,12 @@ fetchData()
|
||||||
</div>
|
</div>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.federation.LibraryWidget.button.showMore') }}
|
{{ t('components.federation.LibraryWidget.button.showMore') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { useI18n } from 'vue-i18n'
|
||||||
import { useClipboard, useVModel } from '@vueuse/core'
|
import { useClipboard, useVModel } from '@vueuse/core'
|
||||||
import { useStore } from '~/store'
|
import { useStore } from '~/store'
|
||||||
|
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Events {
|
interface Events {
|
||||||
(e: 'update:modelValue', value: string): void
|
(e: 'update:modelValue', value: string): void
|
||||||
}
|
}
|
||||||
|
@ -53,22 +55,20 @@ const copyPassword = () => {
|
||||||
name="password"
|
name="password"
|
||||||
:type="passwordInputType"
|
:type="passwordInputType"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
:title="labels.title"
|
:title="labels.title"
|
||||||
class="ui icon button"
|
icon="bi-eye"
|
||||||
@click.prevent="showPassword = !showPassword"
|
@click.prevent="showPassword = !showPassword"
|
||||||
>
|
>
|
||||||
<i class="eye icon" />
|
</Button>
|
||||||
</button>
|
<Button
|
||||||
<button
|
|
||||||
v-if="copyButton && canCopy"
|
v-if="copyButton && canCopy"
|
||||||
type="button"
|
type="button"
|
||||||
class="ui icon button"
|
icon="bi-copy"
|
||||||
:title="labels.copy"
|
:title="labels.copy"
|
||||||
@click.prevent="copyPassword"
|
@click.prevent="copyPassword"
|
||||||
>
|
>
|
||||||
<i class="copy icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -17,6 +17,7 @@ import $ from 'jquery'
|
||||||
import TagsSelector from '~/components/library/TagsSelector.vue'
|
import TagsSelector from '~/components/library/TagsSelector.vue'
|
||||||
import AlbumCard from '~/components/album/Card.vue'
|
import AlbumCard from '~/components/album/Card.vue'
|
||||||
import Pagination from '~/components/vui/Pagination.vue'
|
import Pagination from '~/components/vui/Pagination.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
import useOrdering from '~/composables/navigation/useOrdering'
|
import useOrdering from '~/composables/navigation/useOrdering'
|
||||||
|
@ -141,13 +142,12 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
||||||
name="search"
|
name="search"
|
||||||
:placeholder="labels.searchPlaceholder"
|
:placeholder="labels.searchPlaceholder"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui icon button"
|
|
||||||
type="submit"
|
type="submit"
|
||||||
:aria-label="t('components.library.Albums.button.search')"
|
:aria-label="t('components.library.Albums.button.search')"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
<i class="search icon" />
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
|
|
@ -13,6 +13,7 @@ import useLogger from '~/composables/useLogger'
|
||||||
|
|
||||||
import EmbedWizard from '~/components/audio/EmbedWizard.vue'
|
import EmbedWizard from '~/components/audio/EmbedWizard.vue'
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
import PlayButton from '~/components/audio/PlayButton.vue'
|
import PlayButton from '~/components/audio/PlayButton.vue'
|
||||||
import RadioButton from '~/components/radios/Button.vue'
|
import RadioButton from '~/components/radios/Button.vue'
|
||||||
import Popover from '~/components/ui/Popover.vue'
|
import Popover from '~/components/ui/Popover.vue'
|
||||||
|
@ -161,21 +162,20 @@ watch(() => props.id, fetchData, { immediate: true })
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.library.ArtistBase.button.cancel') }}
|
{{ t('components.library.ArtistBase.button.cancel') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
<div class="ui buttons">
|
<div class="ui buttons">
|
||||||
<Popover>
|
<Popover>
|
||||||
<template #default="{ toggleOpen }">
|
<template #default="{ toggleOpen }">
|
||||||
<button
|
<Button
|
||||||
class="ui button"
|
|
||||||
@click="toggleOpen"
|
@click="toggleOpen"
|
||||||
|
icon="caret-down-fill"
|
||||||
>
|
>
|
||||||
{{ t('components.library.ArtistBase.button.more') }}
|
{{ t('components.library.ArtistBase.button.more') }}
|
||||||
<i class="dropdown icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #items>
|
<template #items>
|
||||||
|
|
|
@ -17,6 +17,7 @@ import $ from 'jquery'
|
||||||
|
|
||||||
import TagsSelector from '~/components/library/TagsSelector.vue'
|
import TagsSelector from '~/components/library/TagsSelector.vue'
|
||||||
import Pagination from '~/components/vui/Pagination.vue'
|
import Pagination from '~/components/vui/Pagination.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
import useOrdering from '~/composables/navigation/useOrdering'
|
import useOrdering from '~/composables/navigation/useOrdering'
|
||||||
|
@ -142,13 +143,12 @@ const paginateOptions = computed(() => sortedUniq([12, 30, 50, paginateBy.value]
|
||||||
name="search"
|
name="search"
|
||||||
:placeholder="labels.searchPlaceholder"
|
:placeholder="labels.searchPlaceholder"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui icon button"
|
|
||||||
type="submit"
|
type="submit"
|
||||||
|
icon="bi-search"
|
||||||
:aria-label="t('components.library.Artists.button.search')"
|
:aria-label="t('components.library.Artists.button.search')"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
|
|
@ -4,6 +4,8 @@ import type { FileSystem, FSEntry } from '~/types'
|
||||||
import { useVModel } from '@vueuse/core'
|
import { useVModel } from '@vueuse/core'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
|
|
||||||
interface Events {
|
interface Events {
|
||||||
(e: 'update:modelValue', value: string[]): void
|
(e: 'update:modelValue', value: string[]): void
|
||||||
|
@ -42,12 +44,12 @@ const handleClick = (entry: FSEntry) => {
|
||||||
disabled
|
disabled
|
||||||
:value="props.data.root + '/' + value.join('/')"
|
:value="props.data.root + '/' + value.join('/')"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui button"
|
class="ui button"
|
||||||
@click.prevent="emit('import')"
|
@click.prevent="emit('import')"
|
||||||
>
|
>
|
||||||
{{ t('components.library.FsBrowser.button.import') }}
|
{{ t('components.library.FsBrowser.button.import') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui list component-fs-browser">
|
<div class="ui list component-fs-browser">
|
||||||
<a
|
<a
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { Upload } from '~/types'
|
import type { Upload } from '~/types'
|
||||||
|
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
|
||||||
import { useVModel } from '@vueuse/core'
|
import { useVModel } from '@vueuse/core'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface ErrorEntry {
|
interface ErrorEntry {
|
||||||
key: string
|
key: string
|
||||||
value: string
|
value: string
|
||||||
|
@ -183,9 +184,9 @@ const getErrorData = (upload: Upload) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.library.ImportStatusModal.button.close') }}
|
{{ t('components.library.ImportStatusModal.button.close') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -3,8 +3,6 @@ import type { OrderingProps } from '~/composables/navigation/useOrdering'
|
||||||
import type { Artist, BackendResponse } from '~/types'
|
import type { Artist, BackendResponse } from '~/types'
|
||||||
import type { RouteRecordName } from 'vue-router'
|
import type { RouteRecordName } from 'vue-router'
|
||||||
import type { OrderingField } from '~/store/ui'
|
import type { OrderingField } from '~/store/ui'
|
||||||
import Popover from "~/components/ui/Popover.vue"
|
|
||||||
import PopoverItem from "~/components/ui/popover/PopoverItem.vue"
|
|
||||||
|
|
||||||
import { computed, ref, watch } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { useRouteQuery } from '@vueuse/router'
|
import { useRouteQuery } from '@vueuse/router'
|
||||||
|
@ -20,6 +18,9 @@ import RemoteSearchForm from '~/components/RemoteSearchForm.vue'
|
||||||
import Modal from '~/components/ui/Modal.vue'
|
import Modal from '~/components/ui/Modal.vue'
|
||||||
import ArtistCard from '~/components/artist/Card.vue'
|
import ArtistCard from '~/components/artist/Card.vue'
|
||||||
import Pagination from '~/components/vui/Pagination.vue'
|
import Pagination from '~/components/vui/Pagination.vue'
|
||||||
|
import Popover from "~/components/ui/Popover.vue"
|
||||||
|
import PopoverItem from "~/components/ui/popover/PopoverItem.vue"
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
import useOrdering from '~/composables/navigation/useOrdering'
|
import useOrdering from '~/composables/navigation/useOrdering'
|
||||||
|
@ -143,13 +144,12 @@ const paginateOptions = computed(() => sortedUniq([12, 30, 50, paginateBy.value]
|
||||||
name="search"
|
name="search"
|
||||||
:placeholder="labels.searchPlaceholder"
|
:placeholder="labels.searchPlaceholder"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui icon button"
|
icon="bi-search"
|
||||||
type="submit"
|
type="submit"
|
||||||
:aria-label="t('components.library.Podcasts.button.search')"
|
:aria-label="t('components.library.Podcasts.button.search')"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
@ -275,17 +275,16 @@ const paginateOptions = computed(() => sortedUniq([12, 30, 50, paginateBy.value]
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui basic deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.library.Podcasts.button.cancel') }}
|
{{ t('components.library.Podcasts.button.cancel') }}
|
||||||
</button>
|
</Button>
|
||||||
<button
|
<Button
|
||||||
form="remote-search"
|
form="remote-search"
|
||||||
type="submit"
|
type="submit"
|
||||||
class="ui primary button"
|
|
||||||
>
|
>
|
||||||
<i class="bookmark icon" />
|
<i class="bookmark icon" />
|
||||||
{{ t('components.library.Podcasts.button.subscribe') }}
|
{{ t('components.library.Podcasts.button.subscribe') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
@ -176,13 +176,12 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
||||||
name="search"
|
name="search"
|
||||||
:placeholder="labels.searchPlaceholder"
|
:placeholder="labels.searchPlaceholder"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui icon button"
|
icon="bi-search"
|
||||||
type="submit"
|
type="submit"
|
||||||
:aria-label="t('components.library.Radios.button.search')"
|
:aria-label="t('components.library.Radios.button.search')"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
|
|
@ -18,6 +18,7 @@ import PlayButton from '~/components/audio/PlayButton.vue'
|
||||||
import Button from '~/components/ui/Button.vue'
|
import Button from '~/components/ui/Button.vue'
|
||||||
import Popover from '~/components/ui/Popover.vue'
|
import Popover from '~/components/ui/Popover.vue'
|
||||||
import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
|
import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import updateQueryString from '~/composables/updateQueryString'
|
import updateQueryString from '~/composables/updateQueryString'
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
@ -191,9 +192,9 @@ const open = ref(false)
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui basic deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.library.TrackBase.button.cancel') }}
|
{{ t('components.library.TrackBase.button.cancel') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
<Popover v-model:open="open">
|
<Popover v-model:open="open">
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { clone } from 'lodash-es'
|
||||||
|
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
import TrackTable from '~/components/audio/track/Table.vue'
|
import TrackTable from '~/components/audio/track/Table.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
|
@ -197,9 +198,9 @@ fetchCandidates()
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.library.radios.Filter.cancelButton') }}
|
{{ t('components.library.radios.Filter.cancelButton') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -14,6 +14,7 @@ import axios from 'axios'
|
||||||
import ImportStatusModal from '~/components/library/ImportStatusModal.vue'
|
import ImportStatusModal from '~/components/library/ImportStatusModal.vue'
|
||||||
import ActionTable from '~/components/common/ActionTable.vue'
|
import ActionTable from '~/components/common/ActionTable.vue'
|
||||||
import Pagination from '~/components/vui/Pagination.vue'
|
import Pagination from '~/components/vui/Pagination.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useSmartSearch from '~/composables/navigation/useSmartSearch'
|
import useSmartSearch from '~/composables/navigation/useSmartSearch'
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
|
@ -334,13 +335,13 @@ const getPrivacyLevelChoice = (privacyLevel: PrivacyLevel) => {
|
||||||
>
|
>
|
||||||
{{ getImportStatusChoice(scope.obj.import_status).label }}
|
{{ getImportStatusChoice(scope.obj.import_status).label }}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<Button
|
||||||
class="ui tiny basic icon button"
|
class="tiny"
|
||||||
|
icon="bi-question-circle"
|
||||||
:title="sharedLabels.fields.import_status.label"
|
:title="sharedLabels.fields.import_status.label"
|
||||||
@click="detailedUpload = scope.obj; showUploadDetailModal = true"
|
@click="detailedUpload = scope.obj; showUploadDetailModal = true"
|
||||||
>
|
>
|
||||||
<i class="question circle outline icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span v-if="scope.obj.size">{{ humanSize(scope.obj.size) }}</span>
|
<span v-if="scope.obj.size">{{ humanSize(scope.obj.size) }}</span>
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { useI18n } from 'vue-i18n'
|
||||||
import InstancePolicyForm from '~/components/manage/moderation/InstancePolicyForm.vue'
|
import InstancePolicyForm from '~/components/manage/moderation/InstancePolicyForm.vue'
|
||||||
import InstancePolicyCard from '~/components/manage/moderation/InstancePolicyCard.vue'
|
import InstancePolicyCard from '~/components/manage/moderation/InstancePolicyCard.vue'
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
target: string
|
target: string
|
||||||
|
@ -59,8 +60,7 @@ const fetchData = async () => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<button
|
<Button
|
||||||
class="ui button"
|
|
||||||
@click.prevent="show = !show"
|
@click.prevent="show = !show"
|
||||||
>
|
>
|
||||||
<i class="shield icon" />
|
<i class="shield icon" />
|
||||||
|
@ -105,10 +105,10 @@ const fetchData = async () => {
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui deny button">
|
<Button color="secondary">
|
||||||
{{ t('components.manage.moderation.InstancePolicyModal.button.close') }}
|
{{ t('components.manage.moderation.InstancePolicyModal.button.close') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import axios from 'axios'
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
import PlaylistCard from '~/components/playlists/Card.vue'
|
import PlaylistCard from '~/components/playlists/Card.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
filters: Record<string, unknown>
|
filters: Record<string, unknown>
|
||||||
|
@ -84,24 +85,22 @@ watch(
|
||||||
<i class="list icon" />
|
<i class="list icon" />
|
||||||
{{ t('components.playlists.Widget.placeholder.noPlaylists') }}
|
{{ t('components.playlists.Widget.placeholder.noPlaylists') }}
|
||||||
</div>
|
</div>
|
||||||
<button
|
<Button
|
||||||
v-if="store.state.auth.authenticated"
|
v-if="store.state.auth.authenticated"
|
||||||
class="ui success icon labeled button"
|
icon="bi-card-list"
|
||||||
@click="store.commit('playlists/chooseTrack', null)"
|
@click="store.commit('playlists/chooseTrack', null)"
|
||||||
>
|
>
|
||||||
<i class="list icon" />
|
|
||||||
{{ t('components.playlists.Widget.button.create') }}
|
{{ t('components.playlists.Widget.button.create') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<template v-if="nextPage">
|
<template v-if="nextPage">
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
<button
|
<Button
|
||||||
v-if="nextPage"
|
v-if="nextPage"
|
||||||
:class="['ui', 'basic', 'button']"
|
|
||||||
@click="fetchData(nextPage)"
|
@click="fetchData(nextPage)"
|
||||||
>
|
>
|
||||||
{{ t('components.playlists.Widget.button.more') }}
|
{{ t('components.playlists.Widget.button.more') }}
|
||||||
</button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,26 +1,15 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
|
import { ref } from 'vue'
|
||||||
import { computed, onBeforeUnmount, ref, watchEffect } from 'vue'
|
import { computed } from 'vue'
|
||||||
import { useVModel } from '@vueuse/core'
|
|
||||||
import { useStore } from '~/store'
|
import { useStore } from '~/store'
|
||||||
import Modal from '~/components/ui/Modal.vue'
|
import Modal from '~/components/ui/Modal.vue'
|
||||||
|
|
||||||
interface Events {
|
|
||||||
(e: 'update:show', show: boolean): void
|
|
||||||
(e: 'approved'): void
|
|
||||||
(e: 'deny'): void
|
|
||||||
(e: 'show'): void
|
|
||||||
(e: 'hide'): void
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
show: boolean
|
|
||||||
fullscreen?: boolean
|
fullscreen?: boolean
|
||||||
scrolling?: boolean
|
scrolling?: boolean
|
||||||
additionalClasses?: string[]
|
additionalClasses?: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const emit = defineEmits<Events>()
|
|
||||||
const props = withDefaults(defineProps<Props>(), {
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
fullscreen: true,
|
fullscreen: true,
|
||||||
scrolling: false,
|
scrolling: false,
|
||||||
|
@ -34,20 +23,17 @@ const classes = computed(() => [
|
||||||
'overlay fullscreen': props.fullscreen && ['phone', 'tablet'].includes(store.getters['ui/windowSize'])
|
'overlay fullscreen': props.fullscreen && ['phone', 'tablet'].includes(store.getters['ui/windowSize'])
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
const isOpen = ref(false)
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<!-- TODO: Replace this file with `components/ui/Modal` -->
|
<Modal <!-- :isOpen="props.show" -->
|
||||||
<!-- <Modal
|
title="props.title"
|
||||||
:model-value="show"
|
|
||||||
@update:model-value="(value) => emit('update:show', value)"
|
|
||||||
:class="classes"
|
:class="classes"
|
||||||
@approve="emit('approved')"
|
|
||||||
@deny="emit('deny')"
|
|
||||||
@show="emit('show')"
|
|
||||||
@hide="emit('hide')"
|
|
||||||
|
|
||||||
>
|
>
|
||||||
<slot />
|
<template v-if="$slots.actions" #actions>
|
||||||
|
</template>
|
||||||
</Modal> -->
|
</Modal> -->
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -17,6 +17,7 @@ import Pagination from '~/components/vui/Pagination.vue'
|
||||||
import RadioButton from '~/components/radios/Button.vue'
|
import RadioButton from '~/components/radios/Button.vue'
|
||||||
import RadioCard from '~/components/radios/Card.vue'
|
import RadioCard from '~/components/radios/Card.vue'
|
||||||
import TagsList from '~/components/tags/List.vue'
|
import TagsList from '~/components/tags/List.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
import useLogger from '~/composables/useLogger'
|
import useLogger from '~/composables/useLogger'
|
||||||
|
@ -260,13 +261,12 @@ const radioConfig = computed(() => {
|
||||||
name="query"
|
name="query"
|
||||||
type="text"
|
type="text"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
:aria-label="labels.submitSearch"
|
:aria-label="labels.submitSearch"
|
||||||
type="submit"
|
type="submit"
|
||||||
class="ui icon button"
|
icon="bi-search"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
</Button>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -9,6 +9,7 @@ import axios from 'axios'
|
||||||
import ChannelsWidget from '~/components/audio/ChannelsWidget.vue'
|
import ChannelsWidget from '~/components/audio/ChannelsWidget.vue'
|
||||||
import RemoteSearchForm from '~/components/RemoteSearchForm.vue'
|
import RemoteSearchForm from '~/components/RemoteSearchForm.vue'
|
||||||
import SemanticModal from '~/components/semantic/Modal.vue'
|
import SemanticModal from '~/components/semantic/Modal.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
|
|
||||||
|
@ -91,17 +92,16 @@ const showSubscribeModal = ref(false)
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui basic deny button">
|
<Button color="secondary">
|
||||||
{{ t('views.channels.SubscriptionsList.button.cancel') }}
|
{{ t('views.channels.SubscriptionsList.button.cancel') }}
|
||||||
</button>
|
</Button>
|
||||||
<button
|
<Button
|
||||||
form="remote-search"
|
form="remote-search"
|
||||||
type="submit"
|
type="submit"
|
||||||
class="ui primary button"
|
icon="bi-bookmark-check-fill"
|
||||||
>
|
>
|
||||||
<i class="bookmark icon" />
|
|
||||||
{{ t('views.channels.SubscriptionsList.button.subscribe') }}
|
{{ t('views.channels.SubscriptionsList.button.subscribe') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</semantic-modal>
|
</semantic-modal>
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ import $ from 'jquery'
|
||||||
|
|
||||||
import PlaylistCardList from '~/components/playlists/CardList.vue'
|
import PlaylistCardList from '~/components/playlists/CardList.vue'
|
||||||
import Pagination from '~/components/vui/Pagination.vue'
|
import Pagination from '~/components/vui/Pagination.vue'
|
||||||
|
import Button from '~/components/ui/Button.vue'
|
||||||
|
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
import useOrdering from '~/composables/navigation/useOrdering'
|
import useOrdering from '~/composables/navigation/useOrdering'
|
||||||
|
@ -114,12 +115,11 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
||||||
{{ t('views.playlists.List.header.browse') }}
|
{{ t('views.playlists.List.header.browse') }}
|
||||||
</h2>
|
</h2>
|
||||||
<template v-if="store.state.auth.authenticated">
|
<template v-if="store.state.auth.authenticated">
|
||||||
<button
|
<Button
|
||||||
class="ui success button"
|
|
||||||
@click="store.commit('playlists/showModal', true)"
|
@click="store.commit('playlists/showModal', true)"
|
||||||
>
|
>
|
||||||
{{ t('views.playlists.List.button.manage') }}
|
{{ t('views.playlists.List.button.manage') }}
|
||||||
</button>
|
</Button>
|
||||||
<div class="ui hidden divider" />
|
<div class="ui hidden divider" />
|
||||||
</template>
|
</template>
|
||||||
<form
|
<form
|
||||||
|
@ -137,13 +137,13 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
||||||
name="search"
|
name="search"
|
||||||
:placeholder="labels.searchPlaceholder"
|
:placeholder="labels.searchPlaceholder"
|
||||||
>
|
>
|
||||||
<button
|
<Button
|
||||||
class="ui icon button"
|
|
||||||
type="submit"
|
type="submit"
|
||||||
|
icon="bi-search"
|
||||||
:aria-label="t('views.playlists.List.button.search')"
|
:aria-label="t('views.playlists.List.button.search')"
|
||||||
>
|
>
|
||||||
<i class="search icon" />
|
<i class="search icon" />
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
|
@ -209,14 +209,13 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
|
||||||
<i class="list icon" />
|
<i class="list icon" />
|
||||||
{{ t('views.playlists.List.empty.noResults') }}
|
{{ t('views.playlists.List.empty.noResults') }}
|
||||||
</div>
|
</div>
|
||||||
<button
|
<Button
|
||||||
v-if="store.state.auth.authenticated"
|
v-if="store.state.auth.authenticated"
|
||||||
class="ui success button labeled icon"
|
icon="bi-list"
|
||||||
@click="store.commit('playlists/showModal', true)"
|
@click="store.commit('playlists/showModal', true)"
|
||||||
>
|
>
|
||||||
<i class="list icon" />
|
|
||||||
{{ t('views.playlists.List.button.create') }}
|
{{ t('views.playlists.List.button.create') }}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui center aligned basic segment">
|
<div class="ui center aligned basic segment">
|
||||||
<pagination
|
<pagination
|
||||||
|
|
Loading…
Reference in New Issue