Enhanced book "Finished On" functionality

This commit is contained in:
aditya.chandel
2025-08-11 22:23:07 -06:00
parent 53aae8bb42
commit c3b2940f36
3 changed files with 49 additions and 46 deletions

View File

@@ -19,6 +19,6 @@ public class ReadProgressRequest {
@AssertTrue(message = "At least one progress field must be provided")
public boolean isProgressValid() {
return epubProgress != null || pdfProgress != null || cbxProgress != null || dateFinished != null;
return epubProgress != null || pdfProgress != null || cbxProgress != null;
}
}

View File

@@ -312,12 +312,9 @@ public class BookService {
userBookProgress.setCbxProgress(request.getCbxProgress().getPage());
userBookProgress.setCbxProgressPercent(request.getCbxProgress().getPercentage());
}
// Update dateFinished if provided
if (request.getDateFinished() != null) {
userBookProgress.setDateFinished(request.getDateFinished());
}
userBookProgressRepository.save(userBookProgress);
}
@@ -340,7 +337,7 @@ public class BookService {
progress.setUser(userEntity);
progress.setBook(book);
progress.setReadStatus(readStatus);
// Set dateFinished when status is READ, clear it otherwise
if (readStatus == ReadStatus.READ) {
progress.setDateFinished(Instant.now());

View File

@@ -303,47 +303,6 @@
{{ getStatusLabel(selectedReadStatus) }}
</span>
<p-menu #menu [popup]="true" [model]="readStatusMenuItems"></p-menu>
@if (selectedReadStatus === ReadStatus.READ) {
@if (!isEditingDateFinished) {
<span class="text-xs text-gray-400 ml-2 cursor-pointer hover:text-gray-300"
(click)="toggleDateFinishedEdit(book)"
pTooltip="Click to edit finish date"
tooltipPosition="bottom">
@if (book?.dateFinished) {
Finished on {{ formatDate(book.dateFinished) }}
} @else {
Click to set finish date
}
</span>
} @else {
<div class="flex items-center gap-2 ml-2">
<p-datepicker
[(ngModel)]="editDateFinished"
dateFormat="dd-M-yy"
[showIcon]="true"
iconDisplay="input"
[style]="{ 'width': '140px', 'font-size': '12px' }"
class="text-xs">
</p-datepicker>
<p-button
icon="pi pi-check"
size="small"
severity="success"
text
(onClick)="saveDateFinished(book)"
pTooltip="Save date">
</p-button>
<p-button
icon="pi pi-times"
size="small"
severity="danger"
text
(onClick)="cancelDateFinishedEdit()"
pTooltip="Cancel">
</p-button>
</div>
}
}
</p>
@if (book?.koreaderProgress && book.koreaderProgress?.percentage != null) {
<p class="whitespace-nowrap flex items-center">
@@ -369,6 +328,53 @@
</span>
</p>
}
@if (selectedReadStatus === ReadStatus.READ) {
<div>
@if (book?.dateFinished) {
<div class="flex items-center gap-2">
<p><strong>Finished On: </strong></p>
@if (!isEditingDateFinished) {
<div class="flex items-center gap-2">
<p>{{ formatDate(book.dateFinished) }}</p>
<i class="pi pi-pencil text-[cornflowerblue] hover:text-[darkturquoise] cursor-pointer"
(click)="toggleDateFinishedEdit(book)">
</i>
</div>
} @else {
<div class="flex items-center">
<p-datepicker
[(ngModel)]="editDateFinished"
dateFormat="dd-M-yy"
size="small"
[showIcon]="true"
iconDisplay="input"
[style]="{ 'width': '125px', 'font-size': '12px' }"
class="text-xs">
</p-datepicker>
<p-button
rounded
icon="pi pi-check"
size="small"
severity="success"
text
(onClick)="saveDateFinished(book)"
pTooltip="Save date">
</p-button>
<p-button
rounded
icon="pi pi-times"
size="small"
severity="danger"
text
(onClick)="cancelDateFinishedEdit()"
pTooltip="Cancel">
</p-button>
</div>
}
</div>
}
</div>
}
<p><strong>Page Count:</strong> {{ book?.metadata!.pageCount || '-' }}</p>
</div>