
* 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
86 lines
3.3 KiB
TypeScript
86 lines
3.3 KiB
TypeScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
|
|
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
import { ToastrService } from 'ngx-toastr';
|
|
import { map, Observable, of, shareReplay, Subject, take, takeUntil } from 'rxjs';
|
|
import { User } from 'src/app/_models/user';
|
|
import { AccountService } from 'src/app/_services/account.service';
|
|
|
|
@Component({
|
|
selector: 'app-change-password',
|
|
templateUrl: './change-password.component.html',
|
|
styleUrls: ['./change-password.component.scss'],
|
|
changeDetection: ChangeDetectionStrategy.OnPush
|
|
})
|
|
export class ChangePasswordComponent implements OnInit, OnDestroy {
|
|
|
|
passwordChangeForm: FormGroup = new FormGroup({});
|
|
user: User | undefined = undefined;
|
|
hasChangePasswordAbility: Observable<boolean> = of(false);
|
|
observableHandles: Array<any> = [];
|
|
passwordsMatch = false;
|
|
resetPasswordErrors: string[] = [];
|
|
isViewMode: boolean = true;
|
|
|
|
public get password() { return this.passwordChangeForm.get('password'); }
|
|
public get confirmPassword() { return this.passwordChangeForm.get('confirmPassword'); }
|
|
|
|
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.cdRef.markForCheck();
|
|
});
|
|
|
|
this.hasChangePasswordAbility = this.accountService.currentUser$.pipe(takeUntil(this.onDestroy), shareReplay(), map(user => {
|
|
return user !== undefined && (this.accountService.hasAdminRole(user) || this.accountService.hasChangePasswordRole(user));
|
|
}));
|
|
this.cdRef.markForCheck();
|
|
|
|
this.passwordChangeForm.addControl('password', new FormControl('', [Validators.required]));
|
|
this.passwordChangeForm.addControl('confirmPassword', new FormControl('', [Validators.required]));
|
|
this.passwordChangeForm.addControl('oldPassword', new FormControl('', [Validators.required]));
|
|
|
|
this.observableHandles.push(this.passwordChangeForm.valueChanges.subscribe(() => {
|
|
const values = this.passwordChangeForm.value;
|
|
this.passwordsMatch = values.password === values.confirmPassword;
|
|
this.cdRef.markForCheck();
|
|
}));
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.observableHandles.forEach(o => o.unsubscribe());
|
|
this.onDestroy.next();
|
|
this.onDestroy.complete();
|
|
}
|
|
|
|
resetPasswordForm() {
|
|
this.passwordChangeForm.get('password')?.setValue('');
|
|
this.passwordChangeForm.get('confirmPassword')?.setValue('');
|
|
this.passwordChangeForm.get('oldPassword')?.setValue('');
|
|
this.resetPasswordErrors = [];
|
|
this.cdRef.markForCheck();
|
|
}
|
|
|
|
savePasswordForm() {
|
|
if (this.user === undefined) { return; }
|
|
|
|
const model = this.passwordChangeForm.value;
|
|
this.resetPasswordErrors = [];
|
|
this.observableHandles.push(this.accountService.resetPassword(this.user?.username, model.confirmPassword, model.oldPassword).subscribe(() => {
|
|
this.toastr.success('Password has been updated');
|
|
this.resetPasswordForm();
|
|
this.isViewMode = true;
|
|
}, err => {
|
|
this.resetPasswordErrors = err;
|
|
}));
|
|
}
|
|
|
|
toggleViewMode() {
|
|
this.isViewMode = !this.isViewMode;
|
|
this.resetPasswordForm();
|
|
}
|
|
}
|