feat: site languages, setup and site URL settings

This commit is contained in:
Florian Sylvain committed 2026-11-01 22:13:02 +01:00
1 parent 0806733d5c
commit d9158025d4
106 files changed
+10184 -56

No files matched your search

@@ -0,0 +1,62 @@
import { describe, expect, it } from 'vitest'
import { createMemoryHistory } from 'vue-router'
import { createAppRouter, resolveAuthRedirect } from '@/router'
import { isRouteAllowed } from '@/lib/routeAccess'
import { accessFor } from '@/test/access'
import { createPinia, setActivePinia } from 'pinia'
import { useSessionStore } from '@/stores/session'
const router = createAppRouter(createMemoryHistory())
function meta(path: string) {
return router.resolve(path).meta
}
describe('Localization routes', () => {
it.each([
['/settings/sites/journal/languages'],
['/settings/sites/journal/public-url'],
['/settings/sites/journal/languages/setup'],
])('%s needs a verified session', (path) => {
expect(meta(path).auth).toBe('verified')
})
it.each([['/settings/sites/journal/languages'], ['/settings/sites/journal/public-url']])(
'%s is open to every verified user',
(path) => {
expect(meta(path).access).toBeUndefined()
},
)
it('keeps the setup page for the permission to manage sites', () => {
const access = meta('/settings/sites/journal/languages/setup').access as { key: string }
expect(access.key).toBe('settings.manage_sites')
const owner = new Set(accessFor('owner')!.permissions.map((grant) => grant.key))
const reader = new Set(accessFor('viewer')!.permissions.map((grant) => grant.key))
expect(isRouteAllowed(access, {}, (key) => owner.has(key))).toBe(true)
expect(isRouteAllowed(access, {}, (key) => reader.has(key))).toBe(false)
})
it('passes the site key as a route parameter', () => {
expect(router.resolve('/settings/sites/archive/languages').params.key).toBe('archive')
expect(router.resolve('/settings/sites/archive/languages/setup').params.key).toBe('archive')
expect(router.resolve('/settings/sites/archive/public-url').params.key).toBe('archive')
})
it.each([
['/settings/sites/journal/languages'],
['/settings/sites/journal/public-url'],
['/settings/sites/journal/languages/setup'],
])('redirects an anonymous visitor of %s to the login page', (path) => {
setActivePinia(createPinia())
const session = useSessionStore()
session.status = 'ready'
session.session = null
const destination = resolveAuthRedirect(router.resolve(path), session)
expect(destination).toEqual({
path: '/login',
query: { redirect: path, reason: 'expired' },
})
})
})
+18
View File
@@ -227,6 +227,24 @@ const routes: RouteRecordRaw[] = [
component: gated('@/views/SitesView.vue', () => import('@/views/SitesView.vue')),
meta: { auth: 'verified', title: 'Settings', access: { key: 'settings.manage_sites' } },
},
{
path: '/settings/sites/:key/languages',
component: () => import('@/views/SiteLanguagesView.vue'),
meta: { auth: 'verified', title: 'Settings' },
},
{
path: '/settings/sites/:key/languages/setup',
component: gated(
'@/views/LanguageSetupView.vue',
() => import('@/views/LanguageSetupView.vue'),
),
meta: { auth: 'verified', title: 'Settings', access: { key: 'settings.manage_sites' } },
},
{
path: '/settings/sites/:key/public-url',
component: () => import('@/views/PublicUrlView.vue'),
meta: { auth: 'verified', title: 'Settings' },
},
{
path: '/settings/permissions',
redirect: '/settings/roles',