uoa-repository-manager-ui/src/app/pages/repository/events/content-events-of-repo-even...

382 lines
12 KiB
TypeScript
Executable File

import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { AdvQueryObject, EventsPage, NotificationFrequency, NotificationMode } from '../../../domain/typeScriptClasses';
import { BrokerService } from '../../../services/broker.service';
import { loadingEvents, noEventsForTopic, noEventsWithParams, noServiceMessage,
subscribingChooseFrequency, subscribingToEvents, subscribingToEventsError,
subscribingToeventsSuccess } from '../../../domain/shared-messages';
import { AbstractControl, FormArray, FormBuilder, FormGroup } from '@angular/forms';
import { AuthenticationService } from '../../../services/authentication.service';
import { ConfirmationDialogComponent } from '../../../shared/reusablecomponents/confirmation-dialog.component';
import { SharedService } from "../../../services/shared.service";
@Component ({
selector: 'app-content-events-of-repo-eventslist',
templateUrl: 'content-events-of-repo-eventslist.component.html'
})
export class ContentEventsOfRepoEventslistComponent implements OnInit {
errorMessage: string;
loadingMessage: string;
successMessage: string;
noEvents: string;
eventsPageInitialized = false;
topic = '';
lastTopicEntry = '';
correctTopic = '';
repoName = '';
advanceSearch: AdvQueryObject;
eventsPage: EventsPage;
currentPage: number; /* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
selectedItemIndex: number;
group: FormGroup;
readonly titleDefinition = { eventTitle: [''] };
readonly authorDefinition = { eventAuthor: [''] };
readonly subjectDefinition = { eventSubject: [''] };
readonly dateRangeDefinition = { dateFrom: '', dateTo: '' };
readonly groupDefinition = {
trustMin: [+''],
trustMax: [+''],
eventTitles: this.fb.array([this.initControl(this.titleDefinition)]),
eventAuthors: this.fb.array([this.initControl(this.authorDefinition)]),
eventSubjects: this.fb.array([this.initControl(this.subjectDefinition)]),
eventDateRanges: this.fb.array([this.initControl(this.dateRangeDefinition)])
};
eventTitleFormArray: any;
eventAuthorFormArray: any;
eventSubjectsFormArray: any;
eventDateRangesFormArray: any;
frequencyChoice = 'daily';
userEmail: string;
modalErrorMessage: string;
isModalShown: boolean;
@ViewChild('subscribeToEventsModal')
public subscribeToEventsModal: ConfirmationDialogComponent;
constructor (private route: ActivatedRoute,
private fb: FormBuilder,
private brokerService: BrokerService,
private authService: AuthenticationService,
private sharedService: SharedService) {}
ngOnInit () {
this.userEmail = this.authService.getUserEmail();
this.getParams();
if(this.sharedService.getRepository()) {
this.repoName = this.sharedService.getRepository().officialName;
this.initQuery();
this.initForm();
this.currentPage = 0; /* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
this.getEventsPage(0);
}
this.sharedService.repository$.subscribe(
r => {
if (r) {
this.repoName = r.officialName;
this.initQuery();
this.initForm();
this.currentPage = 0; /* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
this.getEventsPage(0);
}
}
);
let body = document.getElementsByTagName('body')[0];
body.classList.remove("top_bar_active"); //remove the class
body.classList.add("page_heading_active");
body.classList.remove("landing");
body.classList.add("dashboard");
}
getParams() {
this.topic = this.route.snapshot.paramMap.get('topic');
console.log(`my topic is: ${this.topic}`);
this.lastTopicEntry = this.topic.substring(this.topic.lastIndexOf('|') + 1).toLowerCase();
this.lastTopicEntry = this.replaceAll(this.lastTopicEntry, '_', ' ');
this.getCorrectTopic();
// this.repoName = this.route.snapshot.paramMap.get('name');
}
replaceAll(str, find, replace) {
return str.replace(new RegExp(find, 'g'), replace);
}
initQuery() {
this.advanceSearch = {
datasource: this.repoName,
topic: this.correctTopic,
titles: [],
subjects: [],
authors: [],
dates: [],
trust: {min: '0', max: '1'},
page: 0
};
}
initForm() {
this.group = this.fb.group( this.groupDefinition, { validator: checkMinMax } );
this.group.get('trustMin').setValue(0);
this.group.get('trustMax').setValue(1);
}
initControl(definition: any) {
return this.fb.group(definition);
}
removeControl(controlName: string, i: number) {
const controlArray = <FormArray>this.group.controls[controlName];
controlArray.removeAt(i);
}
addControl(controlName: string, definition: any) {
const controlArray = <FormArray>this.group.controls[controlName];
controlArray.push(this.initControl(definition));
}
clearForm() {
let controlArray: FormArray;
controlArray = <FormArray>this.group.controls['eventTitles'];
controlArray.controls = [];
controlArray.push(this.initControl(this.titleDefinition));
controlArray = <FormArray>this.group.controls['eventAuthors'];
controlArray.controls = [];
controlArray.push(this.initControl(this.authorDefinition));
controlArray = <FormArray>this.group.controls['eventSubjects'];
controlArray.controls = [];
controlArray.push(this.initControl(this.subjectDefinition));
controlArray = <FormArray>this.group.controls['eventDateRanges'];
controlArray.controls = [];
controlArray.push(this.initControl(this.dateRangeDefinition));
this.group.get('trustMin').setValue(0);
this.group.get('trustMax').setValue(1);
this.initQuery();
this.getEventsPage(0);
}
updateQuery() {
let i: number;
let controlArray: FormArray;
if ( this.group.valid ) {
this.initQuery();
this.advanceSearch.trust.min = this.group.get('trustMin').value;
this.advanceSearch.trust.max = this.group.get('trustMax').value;
controlArray = <FormArray>this.group.controls['eventTitles'];
for (i = 0; i < controlArray.length; i++) {
if (controlArray.at(i).get('eventTitle').value) {
this.advanceSearch.titles.push(controlArray.at(i).get('eventTitle').value);
}
}
controlArray = <FormArray>this.group.controls['eventAuthors'];
for (i = 0; i < controlArray.length; i++) {
if (controlArray.at(i).get('eventAuthor').value) {
this.advanceSearch.authors.push(controlArray.at(i).get('eventAuthor').value);
}
}
controlArray = <FormArray>this.group.controls['eventSubjects'];
for (i = 0; i < controlArray.length; i++) {
if (controlArray.at(i).get('eventSubject').value) {
this.advanceSearch.subjects.push(controlArray.at(i).get('eventSubject').value);
}
}
controlArray = <FormArray>this.group.controls['eventDateRanges'];
for (i = 0; i < controlArray.length; i++) {
if (controlArray.at(i).get('dateFrom').value) {
let toDate;
if (controlArray.at(i).get('dateTo').value ||
(controlArray.at(i).get('dateFrom').value > controlArray.at(i).get('dateTo').value) ) {
toDate = controlArray.at(i).get('dateTo').value;
} else {
toDate = Date.now();
}
this.advanceSearch.dates.push({
min: controlArray.at(i).get('dateFrom').value,
max: toDate
});
}
}
console.log(this.advanceSearch);
this.currentPage = 0; /* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
this.getEventsPage(0);
}
}
getEventsPage(page: number) {
this.noEvents = '';
this.errorMessage = '';
this.successMessage = '';
this.loadingMessage = loadingEvents;
this.brokerService.advancedShowEvents(page, 10, this.advanceSearch).subscribe(
events => this.eventsPage = events,
error => {
this.loadingMessage = '';
this.errorMessage = noServiceMessage;
console.log(error);
},
() => {
this.loadingMessage = '';
console.log(this.eventsPage);
if (!this.eventsPage.total) {
if (!this.eventsPageInitialized) {
this.noEvents = noEventsForTopic;
} else {
this.noEvents = noEventsWithParams;
}
}
let tempArray = <FormArray>this.group.controls['eventTitles'];
this.eventTitleFormArray = tempArray.controls;
tempArray = <FormArray>this.group.controls['eventAuthors'];
this.eventAuthorFormArray = tempArray.controls;
tempArray = <FormArray>this.group.controls['eventSubjects'];
this.eventSubjectsFormArray = tempArray.controls;
tempArray = <FormArray>this.group.controls['eventDateRanges'];
this.eventDateRangesFormArray = tempArray.controls;
console.log(`total pages is ${this.eventsPage.totalPages}`);
this.eventsPageInitialized = true;
}
);
}
isHighlighted(item: any, itemList: any[]) {
return itemList.some(x => x === item);
}
getCorrectTopic() {
const temp = this.topic.split('|');
this.correctTopic = temp[0];
this.topic = temp[0];
for (let i = 1; i < temp.length; i++) {
this.correctTopic += `/${temp[i]}`;
this.topic += ` | ${temp[i]}`;
}
}
goToNextPage() {
/* RESTORE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
/*if(this.eventsPage.currPage < this.eventsPage.totalPages) {
console.log(`Get me page ${this.eventsPage.currPage+1}!`);
this.getEventsPage(this.eventsPage.currPage+1);
}*/
/* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
if ( (this.currentPage + 1) < this.eventsPage.totalPages) {
this.currentPage = this.currentPage + 1;
console.log(`Get me page ${this.currentPage}!`);
this.getEventsPage(this.currentPage);
window.scrollTo(0, 0);
}
}
goToPreviousPage() {
/* RESTORE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
/*if(this.eventsPage.currPage > 0) {
console.log(`Get me page ${this.eventsPage.currPage-1}!`);
this.getEventsPage(this.eventsPage.currPage-1);
}*/
/* DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE */
if (this.currentPage > 0) {
this.currentPage = this.currentPage - 1;
console.log(`Get me page ${this.currentPage}!`);
this.getEventsPage(this.currentPage);
window.scrollTo(0, 0);
}
}
showSubscriptionModal() {
if (this.advanceSearch && this.eventsPage) {
this.subscribeToEventsModal.confirmed = false;
this.subscribeToEventsModal.showModal();
}
}
choseFrequency(freq: string) {
this.frequencyChoice = freq;
}
subscribeToEvents(event: any) {
this.modalErrorMessage = '';
if (this.frequencyChoice) {
this.subscribeToEventsModal.confirmed = true;
const freq = <NotificationFrequency>this.frequencyChoice;
const mod: NotificationMode = 'EMAIL';
const sub = {
subscriber: this.userEmail,
frequency: freq,
mode: mod,
query: this.advanceSearch
};
this.errorMessage = '';
this.successMessage = '';
console.log(JSON.stringify(sub));
this.loadingMessage = subscribingToEvents;
this.brokerService.subscribeToEvent(sub).subscribe(
response => console.log(`subscribeToEvents responded ${JSON.stringify(response)}`),
error => {
this.errorMessage = subscribingToEventsError;
this.loadingMessage = '';
},
() => {
this.loadingMessage = '';
this.successMessage = subscribingToeventsSuccess;
}
);
} else {
this.modalErrorMessage = subscribingChooseFrequency;
}
}
// displayFullResultInfo(i: number) {
// if (this.selectedItemIndex === i) {
// this.selectedItemIndex = null;
// } else {
// this.selectedItemIndex = i;
// }
// }
showMore(i: number) {
this.selectedItemIndex = i;
}
showLess(i: number) {
this.selectedItemIndex = null;
}
}
export function checkMinMax(c: AbstractControl) {
if ( c.get('trustMin').value > c.get('trustMax').value ) {
return 'invalid';
}
return null;
}
export function checkDates(c: AbstractControl) {
if ( c.get('dateFrom').value > c.get('dateTo').value ) {
return 'invalid';
}
return null;
}