diff --git a/API/Controllers/PluginController.cs b/API/Controllers/PluginController.cs
index 5f2d99ba3..b6162bb3a 100644
--- a/API/Controllers/PluginController.cs
+++ b/API/Controllers/PluginController.cs
@@ -32,6 +32,7 @@ namespace API.Controllers
// NOTE: In order to log information about plugins, we need some Plugin Description information for each request
// Should log into access table so we can tell the user
var userId = await _unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey);
+ if (userId <= 0) return Unauthorized();
var user = await _unitOfWork.UserRepository.GetUserByIdAsync(userId);
_logger.LogInformation("Plugin {PluginName} has authenticated with {UserName} ({UserId})'s API Key", pluginName, user.UserName, userId);
return new UserDto
diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs
index afc04c4e4..4e0b8291e 100644
--- a/API/Controllers/ReaderController.cs
+++ b/API/Controllers/ReaderController.cs
@@ -408,32 +408,6 @@ namespace API.Controllers
return Ok(false);
}
- ///
- /// Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read.
- ///
- /// This is built for Tachiyomi and is not expected to be called by any other place
- ///
- [HttpPost("mark-chapter-until-as-read")]
- public async Task> MarkChaptersUntilAsRead(int seriesId, float chapterNumber)
- {
- var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Progress);
- user.Progresses ??= new List();
-
- var volumes = await _unitOfWork.VolumeRepository.GetVolumesForSeriesAsync(new List() { seriesId }, true);
- foreach (var volume in volumes.OrderBy(v => v.Number))
- {
- var chapters = volume.Chapters.OrderBy(c => float.Parse(c.Number)).Where(c => !c.IsSpecial && Parser.Parser.MaximumNumberFromRange(c.Range) <= chapterNumber);
- _readerService.MarkChaptersAsRead(user, volume.SeriesId, chapters);
- }
-
- _unitOfWork.UserRepository.Update(user);
-
- if (!_unitOfWork.HasChanges()) return Ok(true);
- if (await _unitOfWork.CommitAsync()) return Ok(true);
-
- await _unitOfWork.RollbackAsync();
- return Ok(false);
- }
///
/// Returns a list of bookmarked pages for a given Chapter
diff --git a/UI/Web/src/app/_models/series-filter.ts b/UI/Web/src/app/_models/series-filter.ts
index 068054a27..51ddca214 100644
--- a/UI/Web/src/app/_models/series-filter.ts
+++ b/UI/Web/src/app/_models/series-filter.ts
@@ -68,4 +68,10 @@ export const mangaFormatFilters = [
value: MangaFormat.ARCHIVE,
selected: false
}
-];
\ No newline at end of file
+];
+
+export interface FilterEvent {
+ filter: SeriesFilter;
+ isFirst: boolean;
+}
+
diff --git a/UI/Web/src/app/all-series/all-series.component.ts b/UI/Web/src/app/all-series/all-series.component.ts
index 51a37fc59..236fd1267 100644
--- a/UI/Web/src/app/all-series/all-series.component.ts
+++ b/UI/Web/src/app/all-series/all-series.component.ts
@@ -10,7 +10,7 @@ import { SeriesAddedEvent } from '../_models/events/series-added-event';
import { Library } from '../_models/library';
import { Pagination } from '../_models/pagination';
import { Series } from '../_models/series';
-import { SeriesFilter } from '../_models/series-filter';
+import { FilterEvent, SeriesFilter } from '../_models/series-filter';
import { ActionItem, Action } from '../_services/action-factory.service';
import { ActionService } from '../_services/action.service';
import { MessageHubService } from '../_services/message-hub.service';
@@ -105,9 +105,9 @@ export class AllSeriesComponent implements OnInit, OnDestroy {
}
}
- updateFilter(data: SeriesFilter) {
- this.filter = data;
- if (this.pagination !== undefined && this.pagination !== null) {
+ updateFilter(data: FilterEvent) {
+ this.filter = data.filter;
+ if (this.pagination !== undefined && this.pagination !== null && !data.isFirst) {
this.pagination.currentPage = 1;
this.onPageChange(this.pagination);
} else {
diff --git a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts
index 43ccc8378..ab3ec7df6 100644
--- a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts
+++ b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts
@@ -14,7 +14,7 @@ import { Language } from 'src/app/_models/metadata/language';
import { PublicationStatusDto } from 'src/app/_models/metadata/publication-status-dto';
import { Pagination } from 'src/app/_models/pagination';
import { Person, PersonRole } from 'src/app/_models/person';
-import { FilterItem, mangaFormatFilters, SeriesFilter, SortField } from 'src/app/_models/series-filter';
+import { FilterEvent, FilterItem, mangaFormatFilters, SeriesFilter, SortField } from 'src/app/_models/series-filter';
import { Tag } from 'src/app/_models/tag';
import { ActionItem } from 'src/app/_services/action-factory.service';
import { CollectionTagService } from 'src/app/_services/collection-tag.service';
@@ -69,7 +69,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy {
@Input() filterSettings!: FilterSettings;
@Output() itemClicked: EventEmitter = new EventEmitter();
@Output() pageChange: EventEmitter = new EventEmitter();
- @Output() applyFilter: EventEmitter = new EventEmitter();
+ @Output() applyFilter: EventEmitter = new EventEmitter();
@ContentChild('cardItem') itemTemplate!: TemplateRef;
@@ -99,6 +99,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy {
updateApplied: number = 0;
+
private onDestory: Subject = new Subject();
get PersonRole(): typeof PersonRole {
@@ -570,7 +571,7 @@ export class CardDetailLayoutComponent implements OnInit, OnDestroy {
}
apply() {
- this.applyFilter.emit(this.filter);
+ this.applyFilter.emit({filter: this.filter, isFirst: this.updateApplied === 0});
this.updateApplied++;
}
diff --git a/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts b/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts
index 02f897451..5eebc5bd3 100644
--- a/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts
+++ b/UI/Web/src/app/collections/collection-detail/collection-detail.component.ts
@@ -13,7 +13,7 @@ import { CollectionTag } from 'src/app/_models/collection-tag';
import { SeriesAddedToCollectionEvent } from 'src/app/_models/events/series-added-to-collection-event';
import { Pagination } from 'src/app/_models/pagination';
import { Series } from 'src/app/_models/series';
-import { SeriesFilter } from 'src/app/_models/series-filter';
+import { FilterEvent, SeriesFilter } from 'src/app/_models/series-filter';
import { AccountService } from 'src/app/_services/account.service';
import { Action, ActionFactoryService, ActionItem } from 'src/app/_services/action-factory.service';
import { ActionService } from 'src/app/_services/action.service';
@@ -175,9 +175,9 @@ export class CollectionDetailComponent implements OnInit, OnDestroy {
});
}
- updateFilter(data: SeriesFilter) {
- this.filter = data;
- if (this.seriesPagination !== undefined && this.seriesPagination !== null) {
+ updateFilter(data: FilterEvent) {
+ this.filter = data.filter;
+ if (this.seriesPagination !== undefined && this.seriesPagination !== null && !data.isFirst) {
this.seriesPagination.currentPage = 1;
this.onPageChange(this.seriesPagination);
} else {
diff --git a/UI/Web/src/app/library-detail/library-detail.component.ts b/UI/Web/src/app/library-detail/library-detail.component.ts
index 05e122913..ab465bf9e 100644
--- a/UI/Web/src/app/library-detail/library-detail.component.ts
+++ b/UI/Web/src/app/library-detail/library-detail.component.ts
@@ -10,7 +10,7 @@ import { SeriesAddedEvent } from '../_models/events/series-added-event';
import { Library } from '../_models/library';
import { Pagination } from '../_models/pagination';
import { Series } from '../_models/series';
-import { SeriesFilter } from '../_models/series-filter';
+import { FilterEvent, SeriesFilter } from '../_models/series-filter';
import { Action, ActionFactoryService, ActionItem } from '../_services/action-factory.service';
import { ActionService } from '../_services/action.service';
import { LibraryService } from '../_services/library.service';
@@ -138,10 +138,10 @@ export class LibraryDetailComponent implements OnInit, OnDestroy {
}
}
- updateFilter(data: SeriesFilter) {
- this.filter = data;
+ updateFilter(event: FilterEvent) {
+ this.filter = event.filter;
const page = this.getPage();
- if (page === undefined || page === null) {
+ if (page === undefined || page === null || !event.isFirst) {
this.pagination.currentPage = 1;
this.onPageChange(this.pagination);
} else {
diff --git a/UI/Web/src/app/on-deck/on-deck.component.ts b/UI/Web/src/app/on-deck/on-deck.component.ts
index 0d8d23ee5..a7bcbe5f1 100644
--- a/UI/Web/src/app/on-deck/on-deck.component.ts
+++ b/UI/Web/src/app/on-deck/on-deck.component.ts
@@ -7,7 +7,7 @@ import { FilterSettings } from '../cards/card-detail-layout/card-detail-layout.c
import { KEY_CODES } from '../shared/_services/utility.service';
import { Pagination } from '../_models/pagination';
import { Series } from '../_models/series';
-import { SeriesFilter} from '../_models/series-filter';
+import { FilterEvent, SeriesFilter} from '../_models/series-filter';
import { Action } from '../_services/action-factory.service';
import { ActionService } from '../_services/action.service';
import { SeriesService } from '../_services/series.service';
@@ -63,9 +63,10 @@ export class OnDeckComponent implements OnInit {
this.loadPage();
}
- updateFilter(data: SeriesFilter) {
- this.filter = data;
- if (this.pagination !== undefined && this.pagination !== null) {
+ updateFilter(event: FilterEvent) {
+ this.filter = event.filter;
+ const page = this.getPage();
+ if (page === undefined || page === null || !event.isFirst) {
this.pagination.currentPage = 1;
this.onPageChange(this.pagination);
} else {
diff --git a/UI/Web/src/app/recently-added/recently-added.component.ts b/UI/Web/src/app/recently-added/recently-added.component.ts
index f7b6f146a..c7ec27d58 100644
--- a/UI/Web/src/app/recently-added/recently-added.component.ts
+++ b/UI/Web/src/app/recently-added/recently-added.component.ts
@@ -9,7 +9,7 @@ import { KEY_CODES } from '../shared/_services/utility.service';
import { SeriesAddedEvent } from '../_models/events/series-added-event';
import { Pagination } from '../_models/pagination';
import { Series } from '../_models/series';
-import { SeriesFilter } from '../_models/series-filter';
+import { FilterEvent, SeriesFilter } from '../_models/series-filter';
import { Action } from '../_services/action-factory.service';
import { ActionService } from '../_services/action.service';
import { MessageHubService } from '../_services/message-hub.service';
@@ -23,6 +23,7 @@ import { SeriesService } from '../_services/series.service';
templateUrl: './recently-added.component.html',
styleUrls: ['./recently-added.component.scss']
})
+
export class RecentlyAddedComponent implements OnInit, OnDestroy {
isLoading: boolean = true;
@@ -81,9 +82,10 @@ export class RecentlyAddedComponent implements OnInit, OnDestroy {
this.loadPage();
}
- applyFilter(data: SeriesFilter) {
- this.filter = data;
- if (this.pagination !== undefined && this.pagination !== null) {
+ applyFilter(event: FilterEvent) {
+ this.filter = event.filter;
+ const page = this.getPage();
+ if (page === undefined || page === null || !event.isFirst) {
this.pagination.currentPage = 1;
this.onPageChange(this.pagination);
} else {