(this.baseUrl + 'person/merge', {destId, srcId});
}
diff --git a/UI/Web/src/app/cards/cover-image-chooser/cover-image-chooser.component.ts b/UI/Web/src/app/cards/cover-image-chooser/cover-image-chooser.component.ts
index fa2a37ae9..41451e872 100644
--- a/UI/Web/src/app/cards/cover-image-chooser/cover-image-chooser.component.ts
+++ b/UI/Web/src/app/cards/cover-image-chooser/cover-image-chooser.component.ts
@@ -10,13 +10,13 @@ import {
Output
} from '@angular/core';
import {FormBuilder, FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';
-import {NgxFileDropEntry, FileSystemFileEntry, NgxFileDropModule} from 'ngx-file-drop';
-import { fromEvent } from 'rxjs';
-import { takeWhile } from 'rxjs/operators';
-import { ToastrService } from 'ngx-toastr';
-import { ImageService } from 'src/app/_services/image.service';
-import { KEY_CODES } from 'src/app/shared/_services/utility.service';
-import { UploadService } from 'src/app/_services/upload.service';
+import {FileSystemFileEntry, NgxFileDropEntry, NgxFileDropModule} from 'ngx-file-drop';
+import {fromEvent} from 'rxjs';
+import {takeWhile} from 'rxjs/operators';
+import {ToastrService} from 'ngx-toastr';
+import {ImageService} from 'src/app/_services/image.service';
+import {KEY_CODES} from 'src/app/shared/_services/utility.service';
+import {UploadService} from 'src/app/_services/upload.service';
import {DOCUMENT, NgClass} from '@angular/common';
import {ImageComponent} from "../../shared/image/image.component";
import {translate, TranslocoModule} from "@jsverse/transloco";
@@ -233,7 +233,8 @@ export class CoverImageChooserComponent implements OnInit {
this.imageSelected.emit(this.selectedIndex); // Auto select newly uploaded image
this.selectedBase64Url.emit(e.target.result);
setTimeout(() => {
- (this.document.querySelector('div.image-card[aria-label="Image ' + this.selectedIndex + '"]') as HTMLElement).focus();
+ // Add 1 since we are adding a new image
+ (this.document.querySelector('div.clickable[aria-label="Image ' + (this.selectedIndex + 1) + '"]') as HTMLElement).focus();
})
this.cdRef.markForCheck();
}
diff --git a/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.html b/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.html
index f6ae1c6ae..84a5821e3 100644
--- a/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.html
+++ b/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.html
@@ -73,7 +73,13 @@
-
+ @if (formControl.errors; as errors) {
+
+ @if (errors.invalidAsin) {
+
{{t('invalid-asin')}}
+ }
+
+ }
diff --git a/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.ts b/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.ts
index 74a20e951..e014411db 100644
--- a/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.ts
+++ b/UI/Web/src/app/person-detail/_modal/edit-person-modal/edit-person-modal.component.ts
@@ -73,7 +73,7 @@ export class EditPersonModalComponent implements OnInit {
editForm: FormGroup = new FormGroup({
name: new FormControl('', [Validators.required]),
description: new FormControl('', []),
- asin: new FormControl('', []),
+ asin: new FormControl('', [], [this.asinValidator()]),
aniListId: new FormControl('', []),
malId: new FormControl('', []),
hardcoverId: new FormControl('', []),
@@ -194,4 +194,21 @@ export class EditPersonModalComponent implements OnInit {
}
}
+ asinValidator(): AsyncValidatorFn {
+ return (control: AbstractControl) => {
+ const asin = control.value;
+ if (!asin || asin.trim().length === 0) {
+ return of(null);
+ }
+
+ return this.personService.isValidAsin(asin).pipe(map(valid => {
+ if (valid) {
+ return null;
+ }
+
+ return { 'invalidAsin': {'asin': asin} } as ValidationErrors;
+ }));
+ }
+ }
+
}
diff --git a/UI/Web/src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.html b/UI/Web/src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.html
index e8a3bafeb..8c2d00c02 100644
--- a/UI/Web/src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.html
+++ b/UI/Web/src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.html
@@ -69,6 +69,11 @@
{{t(TabID.Folder)}}
+
+ @if (filesAtRoot()) {
+ {{t('files-at-root-warning')}}
+ }
+
{{t('folder-description')}}
@for(folder of selectedFolders; track folder) {
@@ -77,7 +82,6 @@
}
-