
* Added ReadingList age rating from all series and started on some unit tests for the new flows. * Wrote more unit tests for Reading Lists * Added ability to restrict user accounts to a given age rating via admin edit user modal and invite user. This commit contains all basic code, but no query modifications. * When updating a reading list's title via UI, explicitly check if there is an existing RL with the same title. * Refactored Reading List calculation to work properly in the flows it's invoked from. * Cleaned up an unused method * Promoted Collections no longer show tags where a Series exists within them that is above the user's age rating. * Collection search now respects age restrictions * Series Detail page now checks if the user has explicit access (as a user might bypass with direct url access) * Hooked up age restriction for dashboard activity streams. * Refactored some methods from Series Controller and Library Controller to a new Search Controller to keep things organized * Updated Search to respect age restrictions * Refactored all the Age Restriction queries to extensions * Related Series no longer show up if they are out of the age restriction * Fixed a bad mapping for the update age restriction api * Fixed a UI state change after updating age restriction * Fixed unit test * Added a migration for reading lists * Code cleanup
79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit } from '@angular/core';
|
|
import { ToastrService } from 'ngx-toastr';
|
|
import { Observable, of, Subject, takeUntil, shareReplay, map, take } from 'rxjs';
|
|
import { AgeRating } from 'src/app/_models/metadata/age-rating';
|
|
import { User } from 'src/app/_models/user';
|
|
import { AccountService } from 'src/app/_services/account.service';
|
|
|
|
@Component({
|
|
selector: 'app-change-age-restriction',
|
|
templateUrl: './change-age-restriction.component.html',
|
|
styleUrls: ['./change-age-restriction.component.scss'],
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
|
})
|
|
export class ChangeAgeRestrictionComponent implements OnInit {
|
|
|
|
user: User | undefined = undefined;
|
|
hasChangeAgeRestrictionAbility: Observable<boolean> = of(false);
|
|
isViewMode: boolean = true;
|
|
selectedRating: AgeRating = AgeRating.NotApplicable;
|
|
originalRating!: AgeRating;
|
|
reset: EventEmitter<AgeRating> = new EventEmitter();
|
|
|
|
get AgeRating() { return AgeRating; }
|
|
|
|
private onDestroy = new Subject<void>();
|
|
|
|
constructor(private accountService: AccountService, private toastr: ToastrService, private readonly cdRef: ChangeDetectorRef) { }
|
|
|
|
ngOnInit(): void {
|
|
this.accountService.currentUser$.pipe(takeUntil(this.onDestroy), shareReplay(), take(1)).subscribe(user => {
|
|
this.user = user;
|
|
this.originalRating = this.user?.ageRestriction || AgeRating.NotApplicable;
|
|
this.cdRef.markForCheck();
|
|
});
|
|
|
|
this.hasChangeAgeRestrictionAbility = this.accountService.currentUser$.pipe(takeUntil(this.onDestroy), shareReplay(), map(user => {
|
|
return user !== undefined && (!this.accountService.hasAdminRole(user) && this.accountService.hasChangeAgeRestrictionRole(user));
|
|
}));
|
|
this.cdRef.markForCheck();
|
|
}
|
|
|
|
updateRestrictionSelection(rating: AgeRating) {
|
|
this.selectedRating = rating;
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.onDestroy.next();
|
|
this.onDestroy.complete();
|
|
}
|
|
|
|
resetForm() {
|
|
if (!this.user) return;
|
|
console.log('resetting to ', this.originalRating)
|
|
this.reset.emit(this.originalRating);
|
|
this.cdRef.markForCheck();
|
|
}
|
|
|
|
saveForm() {
|
|
if (this.user === undefined) { return; }
|
|
|
|
this.accountService.updateAgeRestriction(this.selectedRating).subscribe(() => {
|
|
this.toastr.success('Age Restriction has been updated');
|
|
this.originalRating = this.selectedRating;
|
|
if (this.user) {
|
|
this.user.ageRestriction = this.selectedRating;
|
|
}
|
|
this.resetForm();
|
|
this.isViewMode = true;
|
|
}, err => {
|
|
|
|
});
|
|
}
|
|
|
|
toggleViewMode() {
|
|
this.isViewMode = !this.isViewMode;
|
|
this.resetForm();
|
|
}
|
|
|
|
}
|