134 lines
4.5 KiB
TypeScript
134 lines
4.5 KiB
TypeScript
|
import { Component, OnInit } from '@angular/core';
|
||
|
import { FormBuilder, FormGroup } from '@angular/forms';
|
||
|
import { Subscription } from 'rxjs';
|
||
|
|
||
|
import { ConfigService } from 'app/core/services/config.service';
|
||
|
import { OperatorService } from 'app/core/services/operator.service';
|
||
|
import { UserRepositoryService } from '../services/user-repository.service';
|
||
|
import { ViewUser } from '../models/view-user';
|
||
|
|
||
|
/**
|
||
|
* This component offers an input field for user numbers, and sets/unsets the
|
||
|
* 'is_present' status for the user associated with that number, giving a feedback
|
||
|
* by displaying the name and the new presence status of that user.
|
||
|
*
|
||
|
* The component is typically directly accessed via the router link
|
||
|
*/
|
||
|
@Component({
|
||
|
selector: 'os-presence-detail',
|
||
|
templateUrl: './presence-detail.component.html'
|
||
|
})
|
||
|
export class PresenceDetailComponent implements OnInit {
|
||
|
/**
|
||
|
* The form group for the input field
|
||
|
*/
|
||
|
public userForm: FormGroup;
|
||
|
|
||
|
/**
|
||
|
* Contains the last user entered. Is null if there is no user or the last
|
||
|
* participant number has no unique valid user
|
||
|
*/
|
||
|
public lastChangedUser: ViewUser;
|
||
|
|
||
|
/**
|
||
|
* Subscription to update {@link lastChangedUser}
|
||
|
*/
|
||
|
private _userSubscription: Subscription = null;
|
||
|
public errorMsg: string;
|
||
|
|
||
|
/**
|
||
|
* Config variable if this view is enabled in the config
|
||
|
* TODO: Should be a temporary check, until the permission on users-routing.module is fixed
|
||
|
*/
|
||
|
private _enabledInConfig: boolean;
|
||
|
|
||
|
/**
|
||
|
* permission check if user is allowed to access this view.
|
||
|
* TODO: Should be a temporary check, until the permission on users-routing.module is fixed
|
||
|
*
|
||
|
* @returns true if the user is allowed to use this view
|
||
|
*/
|
||
|
public get permission(): boolean {
|
||
|
return this.operator.hasPerms('users.can_manage') && this._enabledInConfig;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructor. Subscribes to the configuration if this view should be enabled at all
|
||
|
*
|
||
|
* @param userRepo: UserRepositoryService for querying the users
|
||
|
* @param formBuilder FormBuilder input form
|
||
|
* @param operator OperatorService fetch the current user for a permission check
|
||
|
* @param config ConfigService checking if the feature is enabled
|
||
|
*/
|
||
|
public constructor(
|
||
|
private userRepo: UserRepositoryService,
|
||
|
private formBuilder: FormBuilder,
|
||
|
private operator: OperatorService,
|
||
|
config: ConfigService
|
||
|
) {
|
||
|
config.get('users_enable_presence_view').subscribe(conf => (this._enabledInConfig = conf));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* initializes the form control
|
||
|
*/
|
||
|
public ngOnInit(): void {
|
||
|
this.userForm = this.formBuilder.group({
|
||
|
number: ''
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Triggers the user finding and updating process. The user number will be taken from the {@link userForm}.
|
||
|
* Feedback will be relayed to the {@link errorMsg} and/or {@link lastChangedUser} variables
|
||
|
*/
|
||
|
public async changePresence(): Promise<void> {
|
||
|
const number = this.userForm.get('number').value;
|
||
|
const users = this.userRepo.getUsersByNumber(number);
|
||
|
this.userForm.reset();
|
||
|
if (users.length === 1) {
|
||
|
await this.userRepo.update({ is_present: !users[0].is_present }, users[0]);
|
||
|
this.subscribeUser(users[0].id);
|
||
|
} else if (!users.length) {
|
||
|
this.clearSubscription();
|
||
|
this.errorMsg = 'Participant cannot be found';
|
||
|
} else if (users.length > 1) {
|
||
|
this.clearSubscription();
|
||
|
this.errorMsg = 'Participant number is not unique';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Subscribes this component to a user given by an id. The
|
||
|
* {@link lastChangedUser} will be updated accordingly.
|
||
|
*
|
||
|
* @param id the id of the user to be shown as lastChangedUser
|
||
|
*/
|
||
|
private subscribeUser(id: number): void {
|
||
|
this.clearSubscription();
|
||
|
this.errorMsg = null;
|
||
|
this._userSubscription = this.userRepo
|
||
|
.getViewModelObservable(id)
|
||
|
.subscribe(user => (this.lastChangedUser = user));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clears the currently displayed user and subscription, if any is present
|
||
|
*/
|
||
|
private clearSubscription(): void {
|
||
|
if (this._userSubscription) {
|
||
|
this._userSubscription.unsubscribe();
|
||
|
}
|
||
|
this.lastChangedUser = null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* triggers the submission on enter key
|
||
|
*/
|
||
|
public onKeyUp(event: KeyboardEvent): void {
|
||
|
if (event.key === 'Enter') {
|
||
|
this.changePresence();
|
||
|
}
|
||
|
}
|
||
|
}
|