import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; import {IInternalMeeting} from '../../../model/entities/internal-meeting'; import {NgForm} from '@angular/forms'; import {InternalMeetingEditComponent} from '../internal-meeting-edit/internal-meeting-edit.component'; import {Utils} from '../../../utils/utils'; import {Factory} from '../../../factory/factory'; import {IConfig} from '../../../model/virtual/config'; import {AppService} from '../../../services/app.service'; import {IUser} from '../../../model/entities/user'; import {FormComponent} from '../../../components/form-component'; // import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; import {MeetingService} from '../../../services/meeting.service'; import {Const} from '../../../utils/const'; @Component({ selector: 'app-internal-meeting-detail', templateUrl: './internal-meeting-detail.component.html', styleUrls: ['./internal-meeting-detail.component.scss'], // NOTE: We need manual change detection in this component changeDetection: ChangeDetectionStrategy.OnPush, }) export class InternalMeetingDetailComponent extends FormComponent implements OnInit { @Output() editMeeting: EventEmitter = new EventEmitter(); @Output() deleteMeeting: EventEmitter = new EventEmitter(); @Output() editMeetingReport: EventEmitter = new EventEmitter(); @ViewChild('internalMeetingDetailEdit', { static: true }) internalMeetingDetailEdit: InternalMeetingEditComponent; @ViewChild('internalMeetingReportForm', { static: true }) internalMeetingReportForm: NgForm; public internalMeeting: IInternalMeeting; public creator: IUser; public owner: IUser; public participants: IUser[]; public dateStart: string; public dateEnd: string; public timeStart: string; public timeEnd: string; public config: IConfig; public isEditMode: boolean; public errorMsg: string; public reportFormVisible: boolean; public reportOld: string; public hasAdminRights: boolean; constructor(public appService: AppService, private meetingService: MeetingService, /*protected scrollToService: ScrollToService,*/ private ref: ChangeDetectorRef) { super(/*scrollToService*/); } ngOnInit() { this.hasAdminRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); this.config = this.appService.getConfig(); this.internalMeeting = Factory.getEmptyInternalMeeting(); this.creator = Factory.getEmptyUser(); this.owner = Factory.getEmptyUser(); this.participants = []; this.dateStart = ''; this.dateEnd = ''; this.timeStart = ''; this.timeEnd = ''; this.isEditMode = false; this.errorMsg = ''; this.reportFormVisible = false; this.reportOld = ''; } /** * Set data */ public setData(internalMeeting: IInternalMeeting): void { this.internalMeeting = internalMeeting; this.setMeetingData(); } /** * Updates data */ public updateData(internalMeeting: IInternalMeeting): void { if (null !== this.internalMeeting.id) { this.internalMeeting = internalMeeting; this.setMeetingData(); } } /** * Sets variables for meeting */ public setMeetingData() { this.reportFormVisible = false; this.reportOld = this.internalMeeting.report; this.creator = this.config.vc_user_by_id[this.internalMeeting.creation_user_id]; this.owner = this.config.vc_user_by_id[this.internalMeeting.owner_user_id]; this.participants = []; for (let i = 0; i < this.internalMeeting.v_participants.length; i++) { this.participants.push(this.config.vc_user_by_id[this.internalMeeting.v_participants[i].participant_user_id]); } this.dateStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date); this.dateEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date); this.timeStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, false, true); this.timeEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, false, true); this.isEditMode = false; this.errorMsg = ''; this.resetFormValidation(); // NOTE: We need manual change detection in this component this.ref.detectChanges(); } /** * Edit meeting entry */ public editEntry(): void { this.isEditMode = true; this.internalMeetingDetailEdit.setData(Utils.deepClone(this.internalMeeting) as IInternalMeeting); } /** * Edits meeting entry */ public editInternalMeetingFunction(internalMeeting: IInternalMeeting) { this.editMeeting.emit(internalMeeting); } /** * Delete meeting entry */ public deleteEntry(): void { const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); if (confirmAction === true) { this.deleteMeeting.emit(this.internalMeeting.id); } } /** * Check if edit report after meeting has started */ public editReport(): void { this.meetingService.apiCheckInternalMeetingReport(this.internalMeeting.id).subscribe( data => { this.reportFormVisible = data.result_data as boolean; // NOTE: We need manual change detection in this component this.ref.detectChanges(); // todo this.scrollUp('internal-meeting-edit-report'); }, error => { } ); } /** * Resets Form Validation */ public resetFormValidation(): void { if (this.reportFormVisible) { this.internalMeetingReportForm.form.markAsUntouched(); } } /** * Saves internal meeting report */ public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { this.errorMsg = 'Bitte beheben Sie alle Fehler.'; if (valid) { this.editMeetingReport.emit({ id: this.internalMeeting.id, report: this.internalMeeting.report }); this.errorMsg = ''; } else { // todo this.scrollUp('internal-meeting-edit-report'); } } }