mirror of https://github.com/Ombi-app/Ombi
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
5.2 KiB
140 lines
5.2 KiB
import { AfterViewInit, Component, OnInit, ViewChild } from "@angular/core";
|
|
import { ICheckbox, ICustomizationSettings, IEmailNotificationSettings, IUser } from "../interfaces";
|
|
import { IdentityService, NotificationService, SettingsService } from "../services";
|
|
|
|
import { CustomizationFacade } from "../state/customization";
|
|
import { MatSort } from "@angular/material/sort";
|
|
import { MatTableDataSource } from "@angular/material/table";
|
|
import { SelectionModel } from "@angular/cdk/collections";
|
|
|
|
@Component({
|
|
templateUrl: "./usermanagement.component.html",
|
|
styleUrls: ["./usermanagement.component.scss"],
|
|
})
|
|
export class UserManagementComponent implements OnInit {
|
|
|
|
public displayedColumns: string[] = ['select', 'username', 'alias', 'email', 'roles', 'remainingRequests',
|
|
'nextRequestDue', 'lastLoggedIn', 'userType', 'actions'];
|
|
public dataSource: MatTableDataSource<IUser>;
|
|
|
|
public selection = new SelectionModel<IUser>(true, []);
|
|
@ViewChild(MatSort) public sort: MatSort;
|
|
public users: IUser[];
|
|
public checkAll = false;
|
|
public emailSettings: IEmailNotificationSettings;
|
|
public applicationUrl: string;
|
|
public showBulkEdit = false;
|
|
public availableClaims: ICheckbox[];
|
|
public bulkMovieLimit?: number;
|
|
public bulkEpisodeLimit?: number;
|
|
public bulkMusicLimit?: number;
|
|
public bulkStreaming?: string;
|
|
public plexEnabled: boolean;
|
|
|
|
public countries: string[];
|
|
|
|
constructor(private identityService: IdentityService,
|
|
private settingsService: SettingsService,
|
|
private notificationService: NotificationService,
|
|
private plexSettings: SettingsService,
|
|
private customizationFacade: CustomizationFacade) {
|
|
this.dataSource = new MatTableDataSource();
|
|
}
|
|
|
|
|
|
public async ngOnInit() {
|
|
this.identityService.getSupportedStreamingCountries().subscribe(x => this.countries = x);
|
|
this.users = await this.identityService.getUsers().toPromise();
|
|
this.dataSource = new MatTableDataSource(this.users);
|
|
this.dataSource.sort = this.sort;
|
|
|
|
this.plexSettings.getPlex().subscribe(x => this.plexEnabled = x.enable);
|
|
|
|
this.identityService.getAllAvailableClaims().subscribe(x => this.availableClaims = x);
|
|
this.applicationUrl = this.customizationFacade.appUrl();
|
|
this.settingsService.getEmailNotificationSettings().subscribe(x => this.emailSettings = x);
|
|
}
|
|
|
|
public welcomeEmail(user: IUser) {
|
|
if (!user.emailAddress) {
|
|
this.notificationService.error("The user needs an email address.");
|
|
return;
|
|
}
|
|
if (!this.emailSettings.enabled) {
|
|
this.notificationService.error("Email Notifications are not setup, cannot send welcome email");
|
|
return;
|
|
}
|
|
if (!this.emailSettings.notificationTemplates.some(x => {
|
|
return x.enabled && x.notificationType === 8;
|
|
})) {
|
|
this.notificationService.error("The Welcome Email template is not enabled in the Email Setings");
|
|
return;
|
|
}
|
|
this.identityService.sendWelcomeEmail(user).subscribe();
|
|
this.notificationService.success(`Sent a welcome email to ${user.emailAddress}`);
|
|
}
|
|
|
|
public bulkUpdate() {
|
|
const anyRoles = this.availableClaims.some(x => {
|
|
return x.enabled;
|
|
});
|
|
|
|
this.selection.selected.forEach(x => {
|
|
if (anyRoles) {
|
|
x.claims = this.availableClaims;
|
|
}
|
|
if (this.bulkEpisodeLimit) {
|
|
x.episodeRequestLimit = this.bulkEpisodeLimit;
|
|
}
|
|
if (this.bulkMovieLimit) {
|
|
x.movieRequestLimit = this.bulkMovieLimit;
|
|
}
|
|
if (this.bulkMusicLimit) {
|
|
x.musicRequestLimit = this.bulkMusicLimit;
|
|
}
|
|
if (this.bulkStreaming) {
|
|
x.streamingCountry = this.bulkStreaming;
|
|
}
|
|
this.identityService.updateUser(x).subscribe(y => {
|
|
if (!y.successful) {
|
|
this.notificationService.error(`Could not update user ${x.userName}. Reason ${y.errors[0]}`);
|
|
}
|
|
});
|
|
});
|
|
|
|
this.notificationService.success(`Updated users`);
|
|
this.showBulkEdit = false;
|
|
this.bulkMovieLimit = undefined;
|
|
this.bulkEpisodeLimit = undefined;
|
|
this.bulkMusicLimit = undefined;
|
|
this.bulkStreaming = undefined;
|
|
}
|
|
|
|
public isAllSelected() {
|
|
if (!this.dataSource) {
|
|
return;
|
|
}
|
|
const numSelected = this.selection.selected.length;
|
|
const numRows = this.dataSource.data.length;
|
|
return numSelected === numRows;
|
|
}
|
|
|
|
|
|
public masterToggle() {
|
|
if (!this.dataSource) {
|
|
return;
|
|
}
|
|
this.isAllSelected() ?
|
|
this.selection.clear() :
|
|
this.dataSource.data.forEach(row => this.selection.select(row));
|
|
}
|
|
|
|
/** The label for the checkbox on the passed row */
|
|
public checkboxLabel(row?: IUser): string {
|
|
if (!row) {
|
|
return `${this.isAllSelected() ? 'select' : 'deselect'} all`;
|
|
}
|
|
return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row ${row.id + 1}`;
|
|
}
|
|
}
|