feat: implement grid rating formatting and resolution functions

This commit is contained in:
4gray committed 2026-04-22 22:23:30 +02:00
1 parent 199ff91fcc
commit 6904b81c47
2 files changed
+56 -1

No files matched your search

@@ -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');
});
});
@@ -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<GridListItem, 'rating' | 'rating_imdb'>
): string | undefined {
return formatGridRating(item.rating_imdb) ?? formatGridRating(item.rating);
}
@Component({
selector: 'app-grid-list',
template: `<div
@@ -85,7 +109,7 @@ interface GridListItem {
/>
}
</div>
@let rating = i.rating ?? i.rating_imdb;
@let rating = resolveRating(i);
@if (rating) {
<div
class="rating"
@@ -152,6 +176,7 @@ export class GridListComponent {
readonly totalPages = input<number>();
readonly limit = input<number>();
readonly pageSizeOptions = input<number[]>();
protected readonly resolveRating = resolveGridRating;
readonly skeletonRows = computed(() => {
const preferredCount = this.limit() ?? 12;