diff --git a/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.spec.ts b/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.spec.ts new file mode 100644 index 000000000..f783b26f1 --- /dev/null +++ b/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.spec.ts @@ -0,0 +1,30 @@ +import { + formatGridRating, + resolveGridRating, +} from './grid-list.component'; + +describe('grid list rating helpers', () => { + it('rounds numeric ratings to a single decimal place', () => { + expect(formatGridRating(7.243)).toBe('7.2'); + expect(formatGridRating('6.529')).toBe('6.5'); + expect(formatGridRating('6')).toBe('6.0'); + }); + + it('prefers imdb ratings before generic ratings when both are present', () => { + expect( + resolveGridRating({ + rating: '6.529', + rating_imdb: '7.243', + }) + ).toBe('7.2'); + }); + + it('falls back to the generic rating when imdb rating is blank', () => { + expect( + resolveGridRating({ + rating: '5.67', + rating_imdb: ' ', + }) + ).toBe('5.7'); + }); +}); diff --git a/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.ts b/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.ts index 3157b348d..58e635af9 100644 --- a/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.ts +++ b/libs/portal/shared/ui/src/lib/components/grid-list/grid-list.component.ts @@ -30,6 +30,30 @@ interface GridListItem { [key: string]: unknown; } +export function formatGridRating(value: unknown): string | undefined { + if (typeof value === 'number' && Number.isFinite(value)) { + return value.toFixed(1); + } + + if (typeof value !== 'string') { + return undefined; + } + + const trimmed = value.trim(); + if (!trimmed) { + return undefined; + } + + const numericRating = Number.parseFloat(trimmed); + return Number.isFinite(numericRating) ? numericRating.toFixed(1) : trimmed; +} + +export function resolveGridRating( + item: Pick +): string | undefined { + return formatGridRating(item.rating_imdb) ?? formatGridRating(item.rating); +} + @Component({ selector: 'app-grid-list', template: `
}
- @let rating = i.rating ?? i.rating_imdb; + @let rating = resolveRating(i); @if (rating) {
(); readonly limit = input(); readonly pageSizeOptions = input(); + protected readonly resolveRating = resolveGridRating; readonly skeletonRows = computed(() => { const preferredCount = this.limit() ?? 12;