From 0b2e4570529ed76ab9c0cc1d597e936339dadfee Mon Sep 17 00:00:00 2001
From: upsiflu
Date: Thu, 27 Mar 2025 00:10:30 +0100
Subject: [PATCH] fix(front): simplify tags component (tags are just links)
---
front/src/components/ui/Nav.vue | 93 +++++++++++++++++++++++
front/src/views/admin/library/Base.vue | 69 ++++++++---------
front/src/views/admin/moderation/Base.vue | 58 +++++---------
front/src/views/admin/users/Base.vue | 28 +++----
front/src/views/auth/ProfileBase.vue | 54 +++++--------
front/src/views/channels/DetailBase.vue | 47 +++++-------
front/src/views/library/LibraryBase.vue | 74 ++++++++----------
front/ui-docs/.vitepress/config.ts | 1 +
front/ui-docs/components/ui/nav.md | 31 ++++++++
9 files changed, 265 insertions(+), 190 deletions(-)
create mode 100644 front/src/components/ui/Nav.vue
create mode 100644 front/ui-docs/components/ui/nav.md
diff --git a/front/src/components/ui/Nav.vue b/front/src/components/ui/Nav.vue
new file mode 100644
index 000000000..9efb6dbde
--- /dev/null
+++ b/front/src/components/ui/Nav.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+ {{ tab.title }}
+ {{ tab.title }}
+
+ {{ tab.badge }}
+
+
+
+
+
+
+
diff --git a/front/src/views/admin/library/Base.vue b/front/src/views/admin/library/Base.vue
index 749de0f30..dca388e8c 100644
--- a/front/src/views/admin/library/Base.vue
+++ b/front/src/views/admin/library/Base.vue
@@ -1,11 +1,10 @@
@@ -23,40 +50,8 @@ const route = useRoute()
stack
class="page-admin-library"
>
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/front/src/views/admin/moderation/Base.vue b/front/src/views/admin/moderation/Base.vue
index 06b8bdd3c..93a97cfd3 100644
--- a/front/src/views/admin/moderation/Base.vue
+++ b/front/src/views/admin/moderation/Base.vue
@@ -8,8 +8,7 @@ import { useRoute } from 'vue-router'
import axios from 'axios'
import Layout from '~/components/ui/Layout.vue'
-import Tabs from '~/components/ui/Tabs.vue'
-import Tab from '~/components/ui/Tab.vue'
+import Nav from '~/components/ui/Nav.vue'
const store = useStore()
@@ -22,6 +21,24 @@ const labels = computed(() => ({
secondaryMenu: t('views.admin.moderation.Base.menu.secondary')
}))
+const tabs = ref([{
+ title: t('views.admin.moderation.Base.link.reports'),
+ to: { name: 'manage.moderation.reports.list', query: { q: 'resolved:no' } },
+ badge: store.state.ui.notifications.pendingReviewReports > 0 ? store.state.ui.notifications.pendingReviewReports : undefined
+
+}, {
+ title: t('views.admin.moderation.Base.link.userRequests'),
+ to: { name: 'manage.moderation.requests.list', query: { q: 'status:pending' } },
+ badge: store.state.ui.notifications.pendingReviewRequests > 0 ? store.state.ui.notifications.pendingReviewRequests : undefined
+}, {
+ title: t('views.admin.moderation.Base.link.domains'),
+ to: { name: 'manage.moderation.domains.list' }
+}, {
+ title: t('views.admin.moderation.Base.link.accounts'),
+ to: { name: 'manage.moderation.accounts.list' }
+}
+])
+
const fetchNodeInfo = async () => {
const response = await axios.get('instance/nodeinfo/2.1/')
allowListEnabled.value = get(response.data, 'metadata.allowList.enabled', false)
@@ -37,41 +54,8 @@ fetchNodeInfo()
main
no-gap
>
-
-
-
- {{ store.state.ui.notifications.pendingReviewReports }}
-
-
-
-
- {{ store.state.ui.notifications.pendingReviewRequests }}
-
-
-
-
-
+
+
import { useI18n } from 'vue-i18n'
-import { computed } from 'vue'
+import { computed, ref } from 'vue'
import Layout from '~/components/ui/Layout.vue'
-import Tabs from '~/components/ui/Tabs.vue'
-import Tab from '~/components/ui/Tab.vue'
+import Nav from '~/components/ui/Nav.vue'
const { t } = useI18n()
@@ -12,6 +11,18 @@ const labels = computed(() => ({
manageUsers: t('views.admin.users.Base.title'),
secondaryMenu: t('views.admin.users.Base.menu.secondary')
}))
+
+const tabs = ref([
+ {
+ title: t('views.admin.users.Base.link.users'),
+ to: { name: 'manage.users.users.list' }
+ },
+
+ {
+ title: t('views.admin.users.Base.link.invitations'),
+ to: { name: 'manage.users.invitations.list' }
+ }
+])
@@ -20,17 +31,8 @@ const labels = computed(() => ({
main
stack
>
-
-
+
-
-
diff --git a/front/src/views/auth/ProfileBase.vue b/front/src/views/auth/ProfileBase.vue
index e0a1cfad0..8a1609cf6 100644
--- a/front/src/views/auth/ProfileBase.vue
+++ b/front/src/views/auth/ProfileBase.vue
@@ -16,8 +16,7 @@ import RenderedDescription from '~/components/common/RenderedDescription.vue'
import Layout from '~/components/ui/Layout.vue'
import Section from '~/components/ui/Section.vue'
-import Tabs from '~/components/ui/Tabs.vue'
-import Tab from '~/components/ui/Tab.vue'
+import Nav from '~/components/ui/Nav.vue'
interface Events {
(e: 'updated', value: Actor): void
@@ -79,6 +78,21 @@ const fetchData = async () => {
watch(props, fetchData, { immediate: true })
const recentActivity = ref(0)
+
+const tabs = ref([{
+ title: t('views.auth.ProfileBase.link.overview') ,
+ to: { name: 'profile.overview', params: routerParams }
+}, {
+ title: t('views.auth.ProfileBase.link.activity') ,
+ to: { name: 'profile.activity', params: routerParams }
+}, ...(
+ store.state.auth.authenticated && object.value && object.value.full_username === store.state.auth.fullUsername
+ ? [{
+ title: t('views.auth.ProfileBase.link.manageUploads') ,
+ to: { name: 'profile.manageUploads', params: routerParams }
+ }]
+ : []
+)])
@@ -135,38 +149,12 @@ const recentActivity = ref(0)
/>
-
-
-
-
+
-
-
-
-
-
-
-
-
+
diff --git a/front/src/views/channels/DetailBase.vue b/front/src/views/channels/DetailBase.vue
index 4cd44d9ba..a3fa2482a 100644
--- a/front/src/views/channels/DetailBase.vue
+++ b/front/src/views/channels/DetailBase.vue
@@ -24,8 +24,7 @@ import RadioButton from '~/components/radios/Button.vue'
import Loader from '~/components/ui/Loader.vue'
import Button from '~/components/ui/Button.vue'
import Link from '~/components/ui/Link.vue'
-import Tabs from '~/components/ui/Tabs.vue'
-import Tab from '~/components/ui/Tab.vue'
+import Nav from '~/components/ui/Nav.vue'
import OptionsButton from '~/components/ui/button/Options.vue'
import Popover from '~/components/ui/Popover.vue'
import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
@@ -60,7 +59,6 @@ const showEditModal = ref(false)
const showSubscribeModal = ref(false)
const isOwner = computed(() => store.state.auth.authenticated && object.value?.attributed_to.full_username === store.state.auth.fullUsername)
-const isPodcast = computed(() => object.value?.artist?.content_category === 'podcast')
const isPlayable = computed(() => totalTracks.value > 0)
const externalDomain = computed(() => {
const parser = document.createElement('a')
@@ -147,6 +145,18 @@ const updateSubscriptionCount = (delta: number) => {
object.value.subscriptions_count += delta
}
}
+
+const tabs = ref([
+ {
+ title: t('views.channels.DetailBase.link.channelOverview'),
+ to: {name: 'channels.detail', params: { id: props.id }}
+
+ },
+ {
+ title: t('views.channels.DetailBase.link.channelEpisodes'),
+ to: {name: 'channels.detail.episodes', params: { id: props.id }}
+ }
+])
@@ -353,7 +363,7 @@ const updateSubscriptionCount = (delta: number) => {
{{ t('views.channels.DetailBase.link.moderation') }}
@@ -482,28 +492,13 @@ const updateSubscriptionCount = (delta: number) => {
:limit="5"
:show-more="true"
/>
-
-
-
-
-
-
-
-
+
+
+
diff --git a/front/src/views/library/LibraryBase.vue b/front/src/views/library/LibraryBase.vue
index 2d6b4090a..e12d5f8bd 100644
--- a/front/src/views/library/LibraryBase.vue
+++ b/front/src/views/library/LibraryBase.vue
@@ -17,9 +17,7 @@ import OptionsButton from '~/components/ui/button/Options.vue'
import Popover from '~/components/ui/Popover.vue'
import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
import Header from '~/components/ui/Header.vue'
-import Tabs from '~/components/ui/Tabs.vue'
-import Tab from '~/components/ui/Tab.vue'
-import Button from '~/components/ui/Button.vue'
+import Nav from '~/components/ui/Nav.vue'
import useErrorHandler from '~/composables/useErrorHandler'
import useReport from '~/composables/moderation/useReport'
@@ -86,10 +84,22 @@ watchEffect(() => {
})
const updateUploads = (count: number) => {
- if (object.value) {
- object.value.uploads_count += count
- }
+ object.value = object.value
+ ? { ...object.value, uploads_count: object.value.uploads_count + count }
+ : null
}
+
+const tabs = ref([{
+ title: t('views.library.LibraryBase.link.artists'),
+ to: { name: 'library.detail' }
+}, {
+ title: t('views.library.LibraryBase.link.albums'),
+ to: { name: 'library.detail.albums' }
+}, {
+ title: t('views.library.LibraryBase.link.tracks'),
+ to: { name: 'library.detail.tracks' }
+}
+])
@@ -177,13 +187,16 @@ const updateUploads = (count: number) => {
{{ labels.visibility.everyone }}
-
+
{{ t('views.library.LibraryBase.meta.tracks', object.uploads_count) }}
-
+
- {{ humanSize(object?.size) }}
+ {{ humanSize(object.size) }}
@@ -222,40 +235,13 @@ const updateUploads = (count: number) => {
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/front/ui-docs/.vitepress/config.ts b/front/ui-docs/.vitepress/config.ts
index 0ce98c35f..84c2813a5 100644
--- a/front/ui-docs/.vitepress/config.ts
+++ b/front/ui-docs/.vitepress/config.ts
@@ -29,6 +29,7 @@ export default defineConfig({
{ text: 'Pagination', link: '/components/ui/pagination' },
{ text: 'Table of Contents', link: '/components/ui/toc' },
{ text: 'Tabs', link: '/components/ui/tabs' },
+ { text: 'Nav', link: '/components/ui/nav' },
],
},
{
diff --git a/front/ui-docs/components/ui/nav.md b/front/ui-docs/components/ui/nav.md
new file mode 100644
index 000000000..91af3a96f
--- /dev/null
+++ b/front/ui-docs/components/ui/nav.md
@@ -0,0 +1,31 @@
+
+
+```ts
+import Nav from "~/components/ui/Nav.vue"
+```
+
+# Nav
+
+This is just a list of links, styled like tabs.
+
+You can add a `badge` or an `icon` to each tab link.
+
+Hello
+
+```ts
+import { ref } from 'vue'
+
+const nav = ref([{ title: 'Go up', to: '../' }, { title: 'Home', to: './', badge: "2" }])
+```
+
+```vue-html
+
+```
+
+