From 752fda0e934deb12788017c9f3b74939ae5f86d6 Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Tue, 9 Apr 2024 17:57:28 -0500 Subject: [PATCH] PDF Polish (#2837) Co-authored-by: William Brockhus --- API/Controllers/AccountController.cs | 21 +++--- API/Controllers/UsersController.cs | 1 - API/Entities/AppUserPreferences.cs | 3 +- API/I18N/en.json | 1 - .../app/_models/preferences/preferences.ts | 1 - UI/Web/src/app/_services/account.service.ts | 4 +- .../app/admin/license/license.component.html | 64 ++++++++++++------- .../app/admin/license/license.component.ts | 7 +- .../pdf-reader/pdf-reader.component.html | 17 ++--- .../pdf-reader/pdf-reader.component.scss | 3 + .../pdf-reader/pdf-reader.component.ts | 7 +- .../user-preferences.component.html | 58 ++++++----------- .../user-preferences.component.ts | 5 +- UI/Web/src/assets/langs/en.json | 6 +- openapi.json | 11 +--- 15 files changed, 103 insertions(+), 106 deletions(-) diff --git a/API/Controllers/AccountController.cs b/API/Controllers/AccountController.cs index fc5e07378..2ba910ef0 100644 --- a/API/Controllers/AccountController.cs +++ b/API/Controllers/AccountController.cs @@ -37,6 +37,9 @@ namespace API.Controllers; /// public class AccountController : BaseApiController { + // Hardcoded to avoid localization multiple enumeration: https://github.com/Kareadita/Kavita/issues/2829 + private const string BadCredentialsMessage = "Your credentials are not correct"; + private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly ITokenService _tokenService; @@ -204,7 +207,7 @@ public class AccountController : BaseApiController if (user == null) { _logger.LogWarning("Attempted login by {UserName} failed due to unable to find account", loginDto.Username); - return Unauthorized(await _localizationService.Get("en", "bad-credentials")); + return Unauthorized(BadCredentialsMessage); } var roles = await _userManager.GetRolesAsync(user); if (!roles.Contains(PolicyConstants.LoginRole)) return Unauthorized(await _localizationService.Translate(user.Id, "disabled-account")); @@ -225,10 +228,10 @@ public class AccountController : BaseApiController if (!result.Succeeded) { - var errorStr = await _localizationService.Translate(user.Id, - result.IsNotAllowed ? "confirm-email" : "bad-credentials"); - _logger.LogWarning("{UserName} failed to log in at {Time}: {Issue}", user.UserName, user.LastActive, - errorStr); + string errorStr = result.IsNotAllowed + ? await _localizationService.Translate(user.Id, "confirm-email") + : BadCredentialsMessage; + _logger.LogWarning("{UserName} failed to log in at {Time}: {Issue}", user.UserName, user.LastActive, errorStr); return Unauthorized(errorStr); } } @@ -858,7 +861,7 @@ public class AccountController : BaseApiController var user = await _unitOfWork.UserRepository.GetUserByEmailAsync(dto.Email); if (user == null) { - return BadRequest(await _localizationService.Get("en", "bad-credentials")); + return BadRequest(BadCredentialsMessage); } try @@ -868,7 +871,7 @@ public class AccountController : BaseApiController if (!result) { _logger.LogInformation("Unable to reset password, your email token is not correct: {@Dto}", dto); - return BadRequest(await _localizationService.Translate(user.Id, "bad-credentials")); + return BadRequest(BadCredentialsMessage); } var errors = await _accountService.ChangeUserPassword(user, dto.Password); @@ -948,12 +951,12 @@ public class AccountController : BaseApiController public async Task> ConfirmMigrationEmail(ConfirmMigrationEmailDto dto) { var user = await _unitOfWork.UserRepository.GetUserByEmailAsync(dto.Email); - if (user == null) return BadRequest(await _localizationService.Get("en", "bad-credentials")); + if (user == null) return BadRequest(BadCredentialsMessage); if (!await ConfirmEmailToken(dto.Token, user)) { _logger.LogInformation("confirm-migration-email email token is invalid"); - return BadRequest(await _localizationService.Translate(user.Id, "bad-credentials")); + return BadRequest(BadCredentialsMessage); } await _unitOfWork.CommitAsync(); diff --git a/API/Controllers/UsersController.cs b/API/Controllers/UsersController.cs index 1a1f37637..7207c3498 100644 --- a/API/Controllers/UsersController.cs +++ b/API/Controllers/UsersController.cs @@ -119,7 +119,6 @@ public class UsersController : BaseApiController existingPreferences.ShareReviews = preferencesDto.ShareReviews; existingPreferences.PdfTheme = preferencesDto.PdfTheme; - existingPreferences.PdfLayoutMode = preferencesDto.PdfLayoutMode; existingPreferences.PdfScrollMode = preferencesDto.PdfScrollMode; existingPreferences.PdfSpreadMode = preferencesDto.PdfSpreadMode; diff --git a/API/Entities/AppUserPreferences.cs b/API/Entities/AppUserPreferences.cs index 09defda3f..619b94126 100644 --- a/API/Entities/AppUserPreferences.cs +++ b/API/Entities/AppUserPreferences.cs @@ -118,7 +118,8 @@ public class AppUserPreferences /// /// PDF Reader: Layout Mode of the reader /// - public PdfLayoutMode PdfLayoutMode { get; set; } = PdfLayoutMode.Multiple; + /// Book mode is too buggy to include + //public PdfLayoutMode PdfLayoutMode { get; set; } = PdfLayoutMode.Multiple; /// /// PDF Reader: Spread Mode of the reader /// diff --git a/API/I18N/en.json b/API/I18N/en.json index bee5c0ee0..802edb014 100644 --- a/API/I18N/en.json +++ b/API/I18N/en.json @@ -1,6 +1,5 @@ { "confirm-email": "You must confirm your email first", - "bad-credentials": "Your credentials are not correct", "locked-out": "You've been locked out from too many authorization attempts. Please wait 10 minutes.", "disabled-account": "Your account is disabled. Contact the server admin.", "register-user": "Something went wrong when registering user", diff --git a/UI/Web/src/app/_models/preferences/preferences.ts b/UI/Web/src/app/_models/preferences/preferences.ts index 4ccd60d19..b6e364056 100644 --- a/UI/Web/src/app/_models/preferences/preferences.ts +++ b/UI/Web/src/app/_models/preferences/preferences.ts @@ -41,7 +41,6 @@ export interface Preferences { // PDF Reader pdfTheme: PdfTheme; pdfScrollMode: PdfScrollMode; - pdfLayoutMode: PdfLayoutMode; pdfSpreadMode: PdfSpreadMode; // Global diff --git a/UI/Web/src/app/_services/account.service.ts b/UI/Web/src/app/_services/account.service.ts index 1a1484d3f..00ed8f817 100644 --- a/UI/Web/src/app/_services/account.service.ts +++ b/UI/Web/src/app/_services/account.service.ts @@ -142,7 +142,7 @@ export class AccountService { login(model: {username: string, password: string, apiKey?: string}) { return this.httpClient.post(this.baseUrl + 'account/login', model).pipe( - map((response: User) => { + tap((response: User) => { const user = response; if (user) { this.setCurrentUser(user); @@ -176,6 +176,8 @@ export class AccountService { this.stopRefreshTokenTimer(); if (this.currentUser) { + // BUG: StopHubConnection has a promise in it, this needs to be async + // But that really messes everything up this.messageHub.stopHubConnection(); this.messageHub.createHubConnection(this.currentUser); this.hasValidLicense().subscribe(); diff --git a/UI/Web/src/app/admin/license/license.component.html b/UI/Web/src/app/admin/license/license.component.html index a9093c303..5efa58ef2 100644 --- a/UI/Web/src/app/admin/license/license.component.html +++ b/UI/Web/src/app/admin/license/license.component.html @@ -17,12 +17,18 @@ >{{t('renew')}} } } @else { {{t('buy')}} @@ -35,24 +41,29 @@ @if (isViewMode) {
- - ********* - - + @if (hasLicense) { + ********* + @if (isChecking) { +
+ {{t('loading')}} +
+ } @else { + @if (hasValidLicense) { + {{t('license-valid')}} - - {{t('license-not-valid')}} - -
- -
- {{t('loading')}} -
-
+ } -
- {{t('no-license-key')}} + @if (!hasValidLicense) { + + {{t('license-not-valid')}} + + } + } + } + @else { + {{t('no-license-key')}} + }
} @@ -74,11 +85,13 @@ Help -
-
- {{t('discord-validation')}} + @if (formGroup.dirty || formGroup.touched) { +
+
+ {{t('discord-validation')}} +
-
+ }
@@ -93,7 +106,10 @@
diff --git a/UI/Web/src/app/admin/license/license.component.ts b/UI/Web/src/app/admin/license/license.component.ts index 82e05b784..8155c4d0f 100644 --- a/UI/Web/src/app/admin/license/license.component.ts +++ b/UI/Web/src/app/admin/license/license.component.ts @@ -22,7 +22,7 @@ import {catchError} from "rxjs"; styleUrls: ['./license.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [NgIf, NgbTooltip, LoadingComponent, NgbCollapse, ReactiveFormsModule, TranslocoDirective] + imports: [NgbTooltip, LoadingComponent, NgbCollapse, ReactiveFormsModule, TranslocoDirective] }) export class LicenseComponent implements OnInit { @@ -36,7 +36,7 @@ export class LicenseComponent implements OnInit { hasValidLicense: boolean = false; hasLicense: boolean = false; - isChecking: boolean = false; + isChecking: boolean = true; isSaving: boolean = false; buyLink = environment.buyLink; @@ -53,8 +53,11 @@ export class LicenseComponent implements OnInit { this.hasLicense = res; this.cdRef.markForCheck(); }); + this.isChecking = true; + this.cdRef.markForCheck(); this.accountService.hasValidLicense().subscribe(res => { this.hasValidLicense = res; + this.isChecking = false; this.cdRef.markForCheck(); }); } diff --git a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.html b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.html index 5b892ec09..282e234b6 100644 --- a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.html +++ b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.html @@ -43,11 +43,12 @@ (pdfLoaded)="updateLoading(false)" (progress)="updateLoadProgress($event)" (zoomChange)="calcScrollbarNeeded()" + (handToolChange)="updateHandTool($event)" > - @if (scrollMode === ScrollModeType.page) { + @if (scrollMode === ScrollModeType.page && !isLoading) {
} @@ -85,13 +86,13 @@ - - @if (utilityService.getActiveBreakpoint() > Breakpoint.Mobile) { - - } + + + + + + + diff --git a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.scss b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.scss index d1de24e33..edf307f5b 100644 --- a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.scss +++ b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.scss @@ -34,8 +34,11 @@ $pagination-opacity: 0; //$pagination-color: red; //$pagination-opacity: 0.7; $action-bar-height: 36px; +$loading-bar-height: 24px; // Tap to Paginate + + .right { position: absolute; right: 0px; diff --git a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.ts b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.ts index 8366c5028..7948316e7 100644 --- a/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.ts +++ b/UI/Web/src/app/pdf-reader/_components/pdf-reader/pdf-reader.component.ts @@ -34,6 +34,7 @@ import {SpreadType} from "ngx-extended-pdf-viewer/lib/options/spread-type"; import {PdfLayoutModePipe} from "../../_pipe/pdf-layout-mode.pipe"; import {PdfScrollModePipe} from "../../_pipe/pdf-scroll-mode.pipe"; import {PdfSpreadModePipe} from "../../_pipe/pdf-spread-mode.pipe"; +import {HandtoolChanged} from "ngx-extended-pdf-viewer/lib/events/handtool-changed"; @Component({ selector: 'app-pdf-reader', @@ -236,7 +237,7 @@ export class PdfReaderComponent implements OnInit, OnDestroy { init() { - this.pageLayoutMode = this.convertPdfLayoutMode(this.user.preferences.pdfLayoutMode || PdfLayoutMode.Multiple); + this.pageLayoutMode = this.convertPdfLayoutMode(PdfLayoutMode.Multiple); this.scrollMode = this.convertPdfScrollMode(this.user.preferences.pdfScrollMode || PdfScrollMode.Vertical); this.spreadMode = this.convertPdfSpreadMode(this.user.preferences.pdfSpreadMode || PdfSpreadMode.None); this.theme = this.convertPdfTheme(this.user.preferences.pdfTheme || PdfTheme.Dark); @@ -350,6 +351,10 @@ export class PdfReaderComponent implements OnInit, OnDestroy { this.cdRef.markForCheck(); } + updateHandTool(event: any) { + console.log('event.tool', event); + } + prevPage() { this.currentPage--; if (this.currentPage < 0) this.currentPage = 0; diff --git a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.html b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.html index b093676c6..4ac8b10b2 100644 --- a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.html +++ b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.html @@ -542,45 +542,6 @@
-
-
- - {{t('pdf-layout-mode-tooltip')}} - - - - - -
- - -
- - {{t('pdf-scroll-mode-tooltip')}} - - - - - -
-
-
+
+
+ + {{t('pdf-scroll-mode-tooltip')}} + + + + + +
+