feat(cms): clarify sponsor ordering

This commit is contained in:
syntaxbullet
2026-07-31 16:52:49 +02:00
parent 30efb4b36e
commit 95037e9908
5 changed files with 129 additions and 13 deletions

View File

@@ -35,13 +35,13 @@ const partner = (name: string, tier: 1 | 2 | 3, sortOrder: number) => ({
})
const partners = [
partner('Tier One B', 1, 2),
partner('Tier One B', 1, 200),
partner('Tier Three H', 3, 8),
partner('Tier Two B', 2, 2),
partner('Tier Two B', 2, 20),
partner('Tier Three A', 3, 1),
partner('Tier One A', 1, 1),
partner('Tier One A', 1, 100),
partner('Tier Three C', 3, 3),
partner('Tier Two A', 2, 1),
partner('Tier Two A', 2, 10),
partner('Tier Three B', 3, 2),
partner('Tier Three D', 3, 4),
partner('Tier Three E', 3, 5),
@@ -102,7 +102,7 @@ describe('responsive sponsor hierarchy', () => {
afterEach(() => cleanup())
it('groups by Partner tier and sorts each band by Partner sortOrder', () => {
it('keeps tiers separate and applies Partner sortOrder only within each tier', () => {
const grouped = groupSponsorsByTier(partners)
expect(grouped[1].map(({ name }) => name)).toEqual(['Tier One A', 'Tier One B'])
@@ -117,14 +117,32 @@ describe('responsive sponsor hierarchy', () => {
'Tier Three G',
'Tier Three H',
])
expect([...grouped[1], ...grouped[2], ...grouped[3]].map(({ name }) => name)).toEqual([
'Tier One A',
'Tier One B',
'Tier Two A',
'Tier Two B',
'Tier Three A',
'Tier Three B',
'Tier Three C',
'Tier Three D',
'Tier Three E',
'Tier Three F',
'Tier Three G',
'Tier Three H',
])
})
it('defines the approved columns and conservative narrow-mobile fallback', () => {
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'desktop'))).toEqual([2, 3, 4])
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'tablet'))).toEqual([2, 2, 3])
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'mobile'))).toEqual([1, 1, 2])
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'narrow-mobile'))).toEqual([1, 1, 1])
expect(sponsorViewport({ isMobile: false, isNarrowMobile: false, isTabletOrMobile: true })).toBe('tablet')
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'narrow-mobile'))).toEqual([
1, 1, 1,
])
expect(
sponsorViewport({ isMobile: false, isNarrowMobile: false, isTabletOrMobile: true }),
).toBe('tablet')
expect(sponsorCardBasis(3, 16)).toBe('calc((100% - 32px) / 3)')
})
@@ -140,7 +158,9 @@ describe('responsive sponsor hierarchy', () => {
})
expect(screen.getAllByText(sponsorCopy.detailLabel)).toHaveLength(partners.length)
expect(screen.queryByText(netzwerkContent.partners.description)).toBeNull()
netzwerkContent.partners.tiers.forEach(({ label }) => expect(screen.queryByText(label)).toBeNull())
netzwerkContent.partners.tiers.forEach(({ label }) =>
expect(screen.queryByText(label)).toBeNull(),
)
})
it.each([

View File

@@ -0,0 +1,48 @@
import type { Field, NumberField, NumberFieldSingleValidation } from 'payload'
import { describe, expect, it } from 'vitest'
import { Partners } from '@/collections/Partners'
function partnerField(name: string): Field {
const field = Partners.fields.find((candidate) => 'name' in candidate && candidate.name === name)
if (!field) throw new Error(`Missing Partners field: ${name}`)
return field
}
describe('Partners admin ordering contract', () => {
it('shows the title and ordering state needed for content operations', () => {
expect(Partners.admin?.useAsTitle).toBe('name')
expect(Partners.admin?.defaultColumns).toEqual([
'name',
'tier',
'sortOrder',
'_status',
'active',
'showOnHomepage',
'updatedAt',
])
})
it('accepts only numeric tiers 1, 2, and 3', async () => {
const tierField = partnerField('tier')
expect(tierField).toMatchObject({
type: 'number',
min: 1,
max: 3,
required: true,
admin: { step: 1 },
})
const validate = (tierField as NumberField).validate as NumberFieldSingleValidation | undefined
expect(validate).toBeTypeOf('function')
for (const value of [1, 2, 3]) {
expect(await validate?.(value, {} as never)).toBe(true)
}
for (const value of [0, 1.5, 4, Number.NaN, null, undefined]) {
expect(await validate?.(value, {} as never)).toBe('Tier must be one of 1, 2, or 3.')
}
})
})