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 { 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(); } } }