diff --git a/API/Controllers/UploadController.cs b/API/Controllers/UploadController.cs index c0cc46e3e..4d07d4225 100644 --- a/API/Controllers/UploadController.cs +++ b/API/Controllers/UploadController.cs @@ -9,6 +9,7 @@ using Flurl.Http; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; +using NetVips; namespace API.Controllers { diff --git a/API/DTOs/Reader/ChapterInfoDto.cs b/API/DTOs/Reader/ChapterInfoDto.cs index 9f33bada7..6af7442dd 100644 --- a/API/DTOs/Reader/ChapterInfoDto.cs +++ b/API/DTOs/Reader/ChapterInfoDto.cs @@ -1,4 +1,5 @@ -using API.Entities.Enums; +using System; +using API.Entities.Enums; namespace API.DTOs.Reader { diff --git a/API/DTOs/UpdateUserRole.cs b/API/DTOs/UpdateUserRole.cs new file mode 100644 index 000000000..a37076d2c --- /dev/null +++ b/API/DTOs/UpdateUserRole.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using MediatR; + +namespace API.DTOs; + +public class UpdateUserRole : IRequest +{ + public string Username { get; init; } + public IList Roles { get; init; } +} diff --git a/API/Data/MigrateConfigFiles.cs b/API/Data/MigrateConfigFiles.cs index 1acc81b13..51ee37167 100644 --- a/API/Data/MigrateConfigFiles.cs +++ b/API/Data/MigrateConfigFiles.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Abstractions; using System.Linq; using API.Services; using Kavita.Common; diff --git a/API/Data/Repositories/CollectionTagRepository.cs b/API/Data/Repositories/CollectionTagRepository.cs index 111978c72..a519c774f 100644 --- a/API/Data/Repositories/CollectionTagRepository.cs +++ b/API/Data/Repositories/CollectionTagRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; using API.DTOs.CollectionTags; diff --git a/API/Entities/Volume.cs b/API/Entities/Volume.cs index 079cda354..77cd41f82 100644 --- a/API/Entities/Volume.cs +++ b/API/Entities/Volume.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using API.Entities.Interfaces; +using Microsoft.EntityFrameworkCore; namespace API.Entities { diff --git a/API/Helpers/AutoMapperProfiles.cs b/API/Helpers/AutoMapperProfiles.cs index ab0b86167..3765b7e47 100644 --- a/API/Helpers/AutoMapperProfiles.cs +++ b/API/Helpers/AutoMapperProfiles.cs @@ -131,6 +131,7 @@ namespace API.Helpers CreateMap, ServerSettingDto>() .ConvertUsing(); + } } } diff --git a/API/Helpers/SQLHelper.cs b/API/Helpers/SQLHelper.cs index fcd44e7da..d06d246ef 100644 --- a/API/Helpers/SQLHelper.cs +++ b/API/Helpers/SQLHelper.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; +using API.DTOs; using Microsoft.EntityFrameworkCore; namespace API.Helpers diff --git a/API/Startup.cs b/API/Startup.cs index e1dd28a81..2f8ac4d1a 100644 --- a/API/Startup.cs +++ b/API/Startup.cs @@ -19,6 +19,7 @@ using Hangfire; using Hangfire.MemoryStorage; using Kavita.Common; using Kavita.Common.EnvironmentInfo; +using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -131,6 +132,8 @@ namespace API // Add IHostedService for startup tasks // Any services that should be bootstrapped go here services.AddHostedService(); + + services.AddMediatR(typeof(Startup)); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/API/config/kavita.db.dik b/API/config/kavita.db.dik new file mode 100644 index 000000000..4d71b8263 Binary files /dev/null and b/API/config/kavita.db.dik differ diff --git a/API/config/kavita.db.new b/API/config/kavita.db.new new file mode 100644 index 000000000..774d54743 Binary files /dev/null and b/API/config/kavita.db.new differ diff --git a/UI/Web/src/app/_models/events/scan-library-event.ts b/UI/Web/src/app/_models/events/scan-library-event.ts new file mode 100644 index 000000000..b0c663502 --- /dev/null +++ b/UI/Web/src/app/_models/events/scan-library-event.ts @@ -0,0 +1,4 @@ +export interface ScanLibraryEvent { + libraryId: number; + stage: 'complete'; +} \ No newline at end of file diff --git a/UI/Web/src/app/book-reader/book-reader/book-reader.component.html b/UI/Web/src/app/book-reader/book-reader/book-reader.component.html index 410ef7555..93446c1d0 100644 --- a/UI/Web/src/app/book-reader/book-reader/book-reader.component.html +++ b/UI/Web/src/app/book-reader/book-reader/book-reader.component.html @@ -107,15 +107,15 @@ -
-
- +
@@ -123,8 +123,8 @@
-
-
- \ No newline at end of file + 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 466769a99..5f3a2e895 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 @@ -43,7 +43,7 @@ export class CoverImageChooserComponent implements OnInit, OnDestroy { mode: 'file' | 'url' | 'all' = 'all'; private readonly onDestroy = new Subject(); - constructor(public imageService: ImageService, private fb: FormBuilder, private toastr: ToastrService, private uploadService: UploadService, + constructor(public imageService: ImageService, private fb: FormBuilder, private toastr: ToastrService, private uploadService: UploadService, @Inject(DOCUMENT) private document: Document) { } ngOnInit(): void { @@ -89,7 +89,7 @@ export class CoverImageChooserComponent implements OnInit, OnDestroy { img.onload = (e) => this.handleUrlImageAdd(img); img.onerror = (e) => { this.toastr.error('The image could not be fetched due to server refusing request. Please download and upload from file instead.'); - this.form.get('coverImageUrl')?.setValue(''); + this.form.get('coverImageUrl')?.setValue(''); }; this.form.get('coverImageUrl')?.setValue(''); }); @@ -97,7 +97,7 @@ export class CoverImageChooserComponent implements OnInit, OnDestroy { } changeMode(mode: 'url') { - this.mode = mode; + this.mode = mode; this.setupEnterHandler(); setTimeout(() => (this.document.querySelector('#load-image') as HTMLInputElement)?.focus(), 10); @@ -164,7 +164,7 @@ export class CoverImageChooserComponent implements OnInit, OnDestroy { this.loadImage(); break; } - + case KEY_CODES.ESC_KEY: this.mode = 'all'; event.stopPropagation(); diff --git a/UI/Web/src/app/manga-reader/infinite-scroller/infinite-scroller.component.scss b/UI/Web/src/app/manga-reader/infinite-scroller/infinite-scroller.component.scss index 4f2a03219..1d1fe8769 100644 --- a/UI/Web/src/app/manga-reader/infinite-scroller/infinite-scroller.component.scss +++ b/UI/Web/src/app/manga-reader/infinite-scroller/infinite-scroller.component.scss @@ -31,6 +31,10 @@ img, .full-width { height: auto; } +// .img-container { +// overflow: auto; +// } + @keyframes move-up-down { 0%, 100% {