feat(admin): open controller-link settings entries from the settings index

A settings entry with a controller opens that controller's route from
its card (settingsPath); singleton cards still open /settings/<code>.
On a linked controller with no navigation entry of its own the rail
marks Settings current, the breadcrumbs read Settings > entry label
(plus the record title on record and create routes) and the page title
uses the entry label. The settings docs describe the admin behaviour;
the embedded admin shell is rebuilt.
This commit is contained in:
Jakub Zych
2026-10-07 18:24:54 +02:00
parent 4a9b0896b1
commit 0b09acdb0c
13 changed files with 149 additions and 19 deletions

View File

@@ -72,6 +72,37 @@ describe('breadcrumbs', () => {
expect((await crumbsAt('/settings/unknown')).labels).toEqual(['Ustawienia'])
})
it('reads Ustawienia and the entry label on a settings-linked controller', async () => {
const locales = { ...settingsFixture.list.data[0]!, code: 'locales', label: 'Locales', model: '', controller: 'acme.lang.locales' }
const crumbsWithLink = async (path: string) => {
await signIn()
setNavigation(navigationFixture.data)
setSettings([...settingsFixture.list.data, locales])
const router = await routerAt(path)
const wrapper = mount(Breadcrumbs, { global: { plugins: [router] } })
await flushPromises()
const items = wrapper.findAll('[data-crumb]')
return {
labels: items.map((item) => item.text()),
links: items.map((item) => (item.find('a').exists() ? item.find('a').attributes('href') : null)),
current: items.map((item) => item.find('[aria-current="page"]').exists()),
}
}
let crumbs = await crumbsWithLink('/acme/lang/locales')
expect(crumbs.labels).toEqual(['Ustawienia', 'Locales'])
expect(crumbs.links).toEqual(['/settings', null])
expect(crumbs.current).toEqual([false, true])
setRecordCrumb('Polish')
crumbs = await crumbsWithLink('/acme/lang/locales/3')
expect(crumbs.labels).toEqual(['Ustawienia', 'Locales', 'Polish'])
expect(crumbs.links).toEqual(['/settings', '/acme/lang/locales', null])
setRecordCrumb('')
crumbs = await crumbsWithLink('/acme/lang/locales/create')
expect(crumbs.labels).toEqual(['Ustawienia', 'Locales'])
})
it('is empty outside any permitted plugin', async () => {
expect((await crumbsAt('/acme/secret/things')).labels).toEqual([])
expect((await crumbsAt('/acme/demo/unlisted')).labels).toEqual(['Demo'])