Skip to content

Commit 591be64

Browse files
committed
refactor(ui): dashboard rows on paginated book queries
1 parent 3f5b9f4 commit 591be64

33 files changed

Lines changed: 357 additions & 733 deletions

frontend/src/app/features/book/service/sort.service.spec.ts

Lines changed: 0 additions & 88 deletions
This file was deleted.

frontend/src/app/features/book/service/sort.service.ts

Lines changed: 0 additions & 177 deletions
This file was deleted.
Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,60 @@
11
<ng-container *transloco="let t; prefix: 'dashboard.scroller'">
2-
<div class="dashboard-scroller-container">
2+
<div appArtworkRevealGroup class="dashboard-scroller-container">
33
<h2 class="dashboard-scroller-title">
44
{{ title() | transloco }}
55
@if (isMagicShelf()) {
66
<i class="pi pi-sparkles magic-shelf-icon"></i>
77
}
88
</h2>
99

10-
@if (books() !== null && books()?.length === 0) {
11-
<div class="dashboard-scroller-no-books">
12-
<div class="empty-state-icon">
13-
<i class="pi pi-book"></i>
10+
@switch (viewState()) {
11+
@case ('idle') {
12+
<div [class]="stripClass">
13+
<div [style.height.px]="cardHeight()"></div>
1414
</div>
15-
<p>{{ t('noBooksFound') }}</p>
16-
</div>
17-
}
18-
19-
@if (books() && books()!.length > 0) {
20-
<div class="dashboard-scroller-strip">
21-
@for (book of books(); track book.id; let i = $index) {
22-
<div class="dashboard-scroller-card" [ngClass]="{'square-card': useSquareCovers()}">
23-
<app-legacy-book-card
24-
[book]="book"
25-
[index]="i"
26-
[forceEbookMode]="forceEbookMode()"
27-
[useSquareCovers]="useSquareCovers()"
28-
[overlayPreferenceService]="overlayPreferenceService()">
29-
</app-legacy-book-card>
30-
</div>
31-
}
32-
</div>
33-
}
34-
35-
@if (books() === null) {
36-
<div class="dashboard-scroller-error">
37-
<div class="error-icon">
38-
<i class="pi pi-exclamation-triangle"></i>
15+
}
16+
@case ('skeleton') {
17+
<div [class]="stripClass" [style.--card-width.px]="cardWidth()">
18+
@for (skeleton of skeletons; track $index) {
19+
<div class="w-[var(--card-width)] shrink-0">
20+
<app-book-card-skeleton [squareCovers]="squareCovers()" />
21+
</div>
22+
}
23+
</div>
24+
}
25+
@case ('error') {
26+
<div [class]="noticeClass">
27+
<i class="pi pi-exclamation-triangle text-[1.75rem] text-text"></i>
28+
<p class="m-0 max-w-[400px] leading-relaxed text-text-secondary">{{ t('loadError') }}</p>
29+
<app-button variant="soft" size="sm" [label]="'common.retry' | transloco" (clicked)="retry()" />
3930
</div>
40-
<p>{{ t('loadError') }}</p>
41-
</div>
31+
}
32+
@case ('empty') {
33+
<div [class]="noticeClass">
34+
<i class="pi pi-book text-[1.75rem] text-text"></i>
35+
<p class="m-0 max-w-[400px] leading-relaxed text-text-secondary">{{ t('noBooksFound') }}</p>
36+
</div>
37+
}
38+
@case ('books') {
39+
<div [class]="stripClass" [style.--card-width.px]="cardWidth()">
40+
@for (rowBook of rowBooks(); track rowBook.book.id) {
41+
<div class="w-[var(--card-width)] shrink-0">
42+
<app-book-card
43+
[book]="rowBook.book"
44+
[file]="rowBook.file ?? null"
45+
[squareCovers]="squareCovers()"
46+
[showFormatPill]="showFormatPill()"
47+
[detailMode]="'request'"
48+
[menuOpen]="menuOpenBookId() === rowBook.book.id"
49+
(action)="bookNavigation.readBook(rowBook.book, rowBook.file)"
50+
(detailRequested)="openBook(rowBook.book)"
51+
(menuRequested)="bookMenu()?.openFor(rowBook.book, $event, rowBook.file)" />
52+
</div>
53+
}
54+
</div>
55+
56+
<app-book-menu openInNewTab [books]="books()" />
57+
}
4258
}
4359
</div>
4460
</ng-container>

0 commit comments

Comments
 (0)