Newer
Older

Eduard Frankford
committed
import { HttpResponse } from '@angular/common/http';
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { Router } from '@angular/router';
import { faFolder } from '@fortawesome/free-solid-svg-icons';
import { ApplicationInfoService } from 'app/core/application/applicationInfo.service';
import { Account } from 'app/core/auth/account.model';
import { AccountService } from 'app/core/auth/account.service';
import { AlertService } from 'app/core/util/alert.service';

Eduard Frankford
committed
import { LikesService } from 'app/entities/likes/likes.service';
import { ExerciseService } from 'app/exercise/service/exercise.service';

Eduard Frankford
committed
import { SearchService } from 'app/search/service/search-service';

Eduard Frankford
committed
import { ShoppingBasketInfo, ShoppingBasketRedirectInfoDTO } from 'app/shared/model/basket/shopping-basket-info.model';
import { Exercise, searchResultToExercise } from 'app/shared/model/exercise.model';
import { Person } from 'app/shared/model/person.model';

Eduard Frankford
committed
import { PluginActionInfo } from 'app/shared/model/search/search-result-dto.model';
import { PluginService } from 'app/shared/service/plugin-service';
import { WatchlistManager } from 'app/shared/watchlist/watchlist-manager';

Eduard Frankford
committed
import { Subscription } from 'rxjs';

Michael Breu
committed
selector: 'jhi-exercise-details',
templateUrl: './exercise-details.component.html',
styleUrls: ['./exercise-details.component.scss'],

Eduard Frankford
committed
export class ExerciseDetailsComponent implements OnInit, OnDestroy {

Michael Breu
committed
@Input() exercise: Exercise | undefined;
@Output() exerciseChangedEvent = new EventEmitter<Exercise>();

Michael Breu
committed
account: Account | null = null;
authSubscription?: Subscription;

Eduard Frankford
committed
hasLiked: Boolean | null = null;
likeSubscription?: Subscription;

Eduard Frankford
committed
authenticated = false;
oerLink?: String;
oerExerciseMatch = new RegExp('/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$');

Michael Breu
committed
constructor(
private accountService: AccountService,
protected pluginService: PluginService,
private searchService: SearchService,

Eduard Frankford
committed
private likesService: LikesService,
private jhiAlertService: AlertService,
private watchlistManager: WatchlistManager,
private exerciseService: ExerciseService,
private applicationInfoService: ApplicationInfoService,
private router: Router

Michael Breu
committed
) {}

Michael Breu
committed
ngOnInit(): void {
this.authSubscription = this.accountService.getAuthenticationState().subscribe(account => (this.account = account));
this.applicationInfoService.loadOerLink().subscribe(
(res: string) => {
this.oerLink = res;
},
error =>
// eslint-disable-next-line no-console
console.error(error)
);

Michael Breu
committed
}

Michael Breu
committed
public isAuthenticated(): boolean {
return this.accountService.isAuthenticated();
}
isOnCurrentWatchlist(e: Exercise): boolean {
return this.watchlistManager.isExerciseOnCurrentWatchlist(e);
}
handleForCurrentWatchlist(e: Exercise): void {

Eduard Frankford
committed
if (this.watchlistManager.isExerciseOnCurrentWatchlist(e)) {
e.numberOfWatchlistEntries = e.numberOfWatchlistEntries - 1;
} else {
e.numberOfWatchlistEntries = e.numberOfWatchlistEntries + 1;
}
this.watchlistManager.handleCheckForCurrentWatchlist(e);
}
public startAction(action: PluginActionInfo, exercise: Exercise): void {
const basketInfo: ShoppingBasketInfo = {
plugin: action.plugin,
action: action.action,
itemInfos: [exercise.originalResult],
};
this.pluginService.getRedirectLink(basketInfo).subscribe(
(redirectInfo: ShoppingBasketRedirectInfoDTO) => {
// alert('redirecting to ' + redirectInfo.redirectURL);
// location.href = redirectInfo.redirectURL;
window.open(redirectInfo.redirectURL, action.action);
},
() => alert('Search failed')
);
}
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public isEditable(): boolean {
if (!this.exercise) return false;
if (!this.exercise.gitlabURL) return false;
const matchGroups = this.exercise.gitlabURL.match(this.oerExerciseMatch);
if (!matchGroups) return false;
// Just for Testing: allow every edit
if (this.oerLink) return true;
const email = this.accountService.getUserEMail();
if (!email || email == '') return false;
// test all: creator, publisher
let potentialEditors: Person[] = [];
// potentialEditors.concat(this.exercise.contributor);
potentialEditors = potentialEditors.concat(this.exercise.creator);
potentialEditors = potentialEditors.concat(this.exercise.publisher);
for (let i = 0; i < potentialEditors.length; i++) {
if (potentialEditors[i].email.localeCompare(email, undefined, { sensitivity: 'base' }) === 0) return true;
}
return false;
}
public getOEResourceLink(): string {
if (this.oerLink) {
const matchGroups = this.exercise!.gitlabURL.match(this.oerExerciseMatch);
if (!matchGroups) return '';
const guid = matchGroups[1];
return this.oerLink.toString() + '/en/update/1/' + guid;
}
return '';
}

Michael Breu
committed
public download(): void {
this.exportProject(this.exercise!.originalResult.exerciseId);

Michael Breu
committed
}

Eduard Frankford
committed
const recursion = this.downloadWithChildren ? 'WITH_DESCENDANTS' : 'JUST_PROJECT';
return this.searchService.exportProject(exerciseId, recursion).subscribe(

Michael Breu
committed
(response: HttpResponse<Blob>) => {
this.jhiAlertService.addAlert({
type: 'success',
translationKey: 'artemisApp.programmingExercise.export.successMessage',
});
// success('artemisApp.programmingExercise.export.successMessage');

Michael Breu
committed
if (response.body) {
const zipFile = new Blob([response.body], { type: 'application/zip' });
const url = window.URL.createObjectURL(zipFile);
const link = document.createElement('a');
link.setAttribute('href', url);
link.setAttribute('download', response.headers.get('filename')!);
document.body.appendChild(link); // Required for FF
link.click();
window.URL.revokeObjectURL(url);

Michael Breu
committed
},
() => alert('Unable to export exercise. Please log in to export, or check your git lab permissions.')

Michael Breu
committed
);
}
openLink(link: string): void {
window.open(link);
}
hasChildren(): boolean {
return (
this.exercise !== undefined &&
this.exercise.originalResult !== undefined &&
this.exercise.originalResult.file !== undefined &&
this.exercise.originalResult.file.children !== undefined &&
this.exercise.originalResult.file.children.length > 0
);
}
searchChildren(parentId: string): void {
this.router.navigate(['/search'], { queryParams: { p: parentId } });
}
toParent(parentId: string): void {
this.exerciseService.loadExercise(parentId).subscribe(searchResult => {
this.exercise = searchResultToExercise(searchResult);

Eduard Frankford
committed
this.exercise = this.exerciseService.populateExerciseWithData(this.exercise);
this.exerciseChangedEvent.emit(this.exercise);
() => {
alert('parent cannot be loaded');
};
}

Michael Breu
committed
ngOnDestroy(): void {
if (this.authSubscription) {
this.authSubscription.unsubscribe();

Eduard Frankford
committed
}

Michael Breu
committed
}

Michael Breu
committed
/**
* correct missing image urls
*/
correctImageURL(event: Event): void {
const srcElement = event.srcElement as HTMLImageElement;
if (srcElement) {
srcElement.src = '/content/images/Logo_codeAbility_4c_300dpi_RGB3.gif';

Michael Breu
committed
}

Eduard Frankford
committed
likeAction(): void {

Eduard Frankford
committed
// to do call like service

Eduard Frankford
committed
this.likesService.likeExercise(this.exercise!.originalResult.exerciseId).subscribe(() =>

Eduard Frankford
committed
// eslint-disable-next-line no-console

Eduard Frankford
committed
console.log('Liked post' + this.exercise!.originalResult.exerciseId)

Eduard Frankford
committed
);

Eduard Frankford
committed

Eduard Frankford
committed
this.exercise!.numberOfLikes = this.exercise!.numberOfLikes + 1;
this.exercise!.userHasLiked = true;
// eslint-disable-next-line no-console
console.log(`Reloaded number of likes is ${this.exercise!.numberOfLikes}`);

Eduard Frankford
committed
}
unlikeAction(): void {
// to do call like service

Eduard Frankford
committed
this.likesService.unlikeExercise(this.exercise!.originalResult.exerciseId).subscribe(() =>

Eduard Frankford
committed
// eslint-disable-next-line no-console

Eduard Frankford
committed
console.log('Unliked post ' + this.exercise!.originalResult.exerciseId)

Eduard Frankford
committed
);
this.exercise!.numberOfLikes = this.exercise!.numberOfLikes - 1;
this.exercise!.userHasLiked = false;
// eslint-disable-next-line no-console
console.log(`Reloaded number of likes is ${this.exercise!.numberOfLikes}`);

Eduard Frankford
committed
}
toggleWithChildren() {
this.downloadWithChildren = !this.downloadWithChildren;
}
selectREADME(): void {
this.markDownExercise = this.exercise;
}