
* Introduced a lock for DB work during the scan to hopefully reduce the concurrency issues * Don't allow multiple theme scans to occur * Fixed bulk actions not having all actions due to nested actionable menu changes * Refactored the Scan loop to be synchronous to avoid any issues. After first loop, no real performance issues. * Updated the LibraryWatcher when under many internal buffer full issues, to suspend watching for a full hour, to allow whatever downloading to complete. * Removed Semaphore as it's not needed anymore * Updated the output for logger to explicitly say from Kavita (if you're pushing to Seq) * Fixed a broken test * Fixed ReleaseYear not populating due to a change from a contributor around how to populate ReleaseYear. * Ensure when scan folder runs, that we don't double enqueue the same tasks. * Fixed user settings not loading the correct tab * Changed the Release Year -> Release * Added more refresh hooks in reader to hopefully ensure faster refreshes * Reset images between chapter loads to help flush image faster. Don't show broken image icon when an image is still loading. * Fixed the prefetcher not properly loading the correct images and hence, allowing a bit of lag between chapter loads. * Code smells
59 lines
2 KiB
TypeScript
59 lines
2 KiB
TypeScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';
|
|
import { Subject, takeUntil } from 'rxjs';
|
|
import { Action, ActionFactoryService, ActionItem } from 'src/app/_services/action-factory.service';
|
|
import { BulkSelectionService } from '../bulk-selection.service';
|
|
|
|
@Component({
|
|
selector: 'app-bulk-operations',
|
|
templateUrl: './bulk-operations.component.html',
|
|
styleUrls: ['./bulk-operations.component.scss'],
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
|
})
|
|
export class BulkOperationsComponent implements OnInit, OnDestroy {
|
|
|
|
@Input() actionCallback!: (action: ActionItem<any>, data: any) => void;
|
|
|
|
topOffset: number = 56;
|
|
hasMarkAsRead: boolean = false;
|
|
hasMarkAsUnread: boolean = false;
|
|
actions: Array<ActionItem<any>> = [];
|
|
|
|
private onDestory: Subject<void> = new Subject();
|
|
|
|
get Action() {
|
|
return Action;
|
|
}
|
|
|
|
constructor(public bulkSelectionService: BulkSelectionService, private readonly cdRef: ChangeDetectorRef,
|
|
private actionFactoryService: ActionFactoryService) { }
|
|
|
|
ngOnInit(): void {
|
|
this.bulkSelectionService.actions$.pipe(takeUntil(this.onDestory)).subscribe(actions => {
|
|
// We need to do a recursive callback apply
|
|
this.actions = this.actionFactoryService.applyCallbackToList(actions, this.actionCallback.bind(this));
|
|
this.hasMarkAsRead = this.actionFactoryService.hasAction(this.actions, Action.MarkAsRead);
|
|
this.hasMarkAsUnread = this.actionFactoryService.hasAction(this.actions, Action.MarkAsUnread);
|
|
this.cdRef.markForCheck();
|
|
});
|
|
}
|
|
|
|
ngOnDestroy(): void {
|
|
this.onDestory.next();
|
|
this.onDestory.complete();
|
|
}
|
|
|
|
handleActionCallback(action: ActionItem<any>, data: any) {
|
|
this.actionCallback(action, data);
|
|
}
|
|
|
|
performAction(action: ActionItem<any>) {
|
|
this.actionCallback(action, null);
|
|
}
|
|
|
|
executeAction(action: Action) {
|
|
const foundActions = this.actions.filter(act => act.action === action);
|
|
if (foundActions.length > 0) {
|
|
this.performAction(foundActions[0]);
|
|
}
|
|
}
|
|
}
|