Skip to content
Snippets Groups Projects
Commit bcda2f42 authored by bedran.sezer's avatar bedran.sezer
Browse files

update Application Settings for Authentification

parent 56deaad7
No related branches found
No related tags found
No related merge requests found
Showing
with 424 additions and 243 deletions
......@@ -21,6 +21,7 @@
"src/favicon.ico"
],
"styles": [
"node_modules/@fortawesome/fontawesome-free/css/all.min.css",
"node_modules/perfect-scrollbar/css/perfect-scrollbar.css",
"src/assets/scss/material-dashboard.scss",
"src/assets/css/demo.css"
......@@ -57,12 +58,10 @@
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"fileReplacements": [{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
}]
},
"development": {
"vendorChunk": true,
......
......@@ -21,6 +21,7 @@
"@angular/platform-browser": "^14.2.0",
"@angular/platform-browser-dynamic": "^14.2.0",
"@angular/router": "^14.3.0",
"@fortawesome/fontawesome-free": "^6.5.1",
"ajv": "8.11.0",
"arrive": "2.4.1",
"bootstrap": "4.6.1",
......@@ -2986,6 +2987,15 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@fortawesome/fontawesome-free": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz",
"integrity": "sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw==",
"hasInstallScript": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@gar/promisify": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
......
......@@ -29,6 +29,7 @@
"@angular/platform-browser": "^14.2.0",
"@angular/platform-browser-dynamic": "^14.2.0",
"@angular/router": "^14.3.0",
"@fortawesome/fontawesome-free": "^6.5.1",
"ajv": "8.11.0",
"arrive": "2.4.1",
"bootstrap": "4.6.1",
......
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Assignment } from './model/assignment';
@Injectable({
providedIn: 'root'
})
export class AssignmentService {
private baseUrl = 'http://localhost:3000';
constructor(private http: HttpClient) {}
getAssignment(): Observable<Assignment[]> {
return this.http.get<Assignment[]>(`${this.baseUrl}/assignments`);
}
getAssignmentTitles(): Observable<string[]> {
return this.http.get<string[]>(`${this.baseUrl}/assignments/name`);
}
}
......@@ -2,7 +2,7 @@ import { Component, OnInit, ElementRef } from '@angular/core';
import { ROUTES } from '../sidebar/sidebar.component';
import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common';
import { Router } from '@angular/router';
import { AuthService} from "../../auth_service";
import { AuthService} from "../../../services/auth_service";
@Component({
selector: 'app-navbar',
......
import { Component, OnInit } from '@angular/core';
import { AssignmentService } from 'app/assignment.service';
import { AssignmentService } from 'services/assignment.service';
import { Assignment } from '../model/assignment';
import { ExerciseService } from 'app/exercise.service';
import { ExerciseService } from 'services/exercise.service';
import { Exercise } from 'app/model/exercise';
......@@ -20,7 +20,7 @@ export class CreateExerciseComponent implements OnInit {
ngOnInit(): void {
// Récupérer la liste des assignments lors de l'initialisation du composant
this.assignmentService.getAssignment().subscribe(assignments => {
this.assignmentService.getAssignments().subscribe(assignments => {
this.assignments = assignments;
});
}
......
......@@ -34,6 +34,38 @@
<label for="gitlabLink">Lien GitLab :</label>
<input type="text" id="gitlabLink" name="gitlabLink" [(ngModel)]="exercise.gitlabLink" class="form-control" readonly>
</div>
<div *ngIf="results && results.length > 0" class="form-group">
<h5>Résultats de l'exercice :</h5>
<ul>
<li *ngFor="let result of results">
<p>Date et heure : {{ result.dateTime | date: 'medium' }}</p>
<p>Résultats :</p>
<ul>
<li>Tests réussis : {{ result.results.successfulTests }}</li>
<li>Tests échoués : {{ result.results.failedTests }}</li>
<li>Liste des tests réussis :
<ul>
<li *ngFor="let test of result.results.successfulTestsList">
{{ test }} <i class="fas fa-check-circle text-success"></i>
</li>
</ul>
</li>
<li>Liste des tests échoués :
<ul>
<li *ngFor="let test of result.results.failedTestsList">
{{ test }} <i class="fas fa-times-circle text-danger"></i>
</li>
</ul>
</li>
</ul>
<hr>
</li>
</ul>
</div>
<div *ngIf="!results || results.length === 0" class="form-group">
<p>Aucun résultat disponible pour cet exercice.</p>
</div>
</form>
</div>
......
......@@ -2,8 +2,9 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ExerciseService } from 'app/exercise.service';
import { ExerciseService } from 'services/exercise.service';
import { Exercise } from 'app/model/exercise';
import { Result } from 'app/model/result';
@Component({
selector: 'app-exercise-details',
......@@ -13,6 +14,8 @@ import { Exercise } from 'app/model/exercise';
export class ExerciseDetailsComponent implements OnInit {
exerciseId: string;
exercise: Exercise;
results: Result[];
res: [];
constructor(private route: ActivatedRoute, private exerciseService: ExerciseService) { }
......@@ -31,5 +34,28 @@ export class ExerciseDetailsComponent implements OnInit {
}
);
}
this.loadResults();
}
loadResults(): void {
this.exerciseService.getResults().subscribe(
data => {
this.results = data.map(result => {
// Convertir les champs JSON encodés en objets JavaScript
result.results = JSON.parse(result.results);
return result;
});
// Afficher les résultats
if (this.results && this.results.length > 0) {
this.results.forEach(result => {
console.log('Results :', result.results);
});
}
},
error => {
console.error('Erreur lors de la récupération des résultats :', error);
}
);
}
}
// exercises.component.ts
import { Component, OnInit } from '@angular/core';
import {ExerciseService} from "../exercise.service";
import {ExerciseService} from "../../services/exercise.service";
@Component({
selector: 'app-exercises',
......
<div class="main-content">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-danger">
<h4 class="card-title">Liste des exercices pour {{ assignmentName }}</h4>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table">
<thead class="text-primary">
<tr>
<th>Nom de l'Exercice</th>
<th>Lien Gitlab</th>
<th>Détails</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let exercise of exercises">
<td>{{ exercise.name }}</td>
<td>{{ exercise.gitlabLink }}</td>
<td>
<a [routerLink]="['/exercise-details', exercise.id]">
<i class="fa fa-eye"></i>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ExerciseFromAssign } from './exercise_from_assign.component';
describe('DetailExerciseComponent', () => {
let component: ExerciseFromAssign;
let fixture: ComponentFixture<ExerciseFromAssign>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ExerciseFromAssign ]
})
.compileComponents();
fixture = TestBed.createComponent(ExerciseFromAssign);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
// exercise.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Exercise } from 'app/model/exercise';
import { ExerciseService } from 'services/exercise.service';
@Component({
selector: 'app-exercise-from-assign',
templateUrl: './exercise_from_assign.component.html',
styleUrls: ['./exercise_from_assign.component.css']
})
export class ExerciseFromAssign implements OnInit {
assignmentName: string;
exercises: Exercise[];
constructor(private route: ActivatedRoute, private exerciseService: ExerciseService) { }
ngOnInit(): void {
this.route.paramMap.subscribe(params => {
this.assignmentName = params.get('assignmentName');
this.getExercisesByAssignmentName(this.assignmentName);
});
}
getExercisesByAssignmentName(assignmentName: string): void {
this.exerciseService.getExercisesByAssignmentName(assignmentName).subscribe(exercises => {
this.exercises = exercises;
});
}
}
\ No newline at end of file
......@@ -13,6 +13,8 @@ import {LoginComponent} from "../../login/login.component";
import { ExerciseComponent } from 'app/exercise/exercise.component';
import { ListExerciseComponent } from 'app/list-exercise/list-exercise.component';
import { CreateExerciseComponent } from 'app/create-exercise/create-exercise.component';
import { ExerciseFromAssign } from 'app/exercise_from_assign/exercise_from_assign.component';
import { ExerciseDetailsComponent } from 'app/exercise-details/exercise-details.component';
export const AdminLayoutRoutes: Routes = [
{ path: 'dashboard', component: DashboardComponent },
......@@ -24,8 +26,10 @@ export const AdminLayoutRoutes: Routes = [
{ path: 'maps', component: MapsComponent },
{ path: 'notifications', component: NotificationsComponent },
{ path: 'exercise-page', component: ExercisePageComponent },
{ path :'exercise_from_assign/:assignmentName', component : ExerciseFromAssign},
{ path: 'upgrade', component: UpgradeComponent },
{ path: 'exercise', component: ExerciseComponent },
{ path : 'exercise-details/:id', component:ExerciseDetailsComponent }
......
// exercise.component.ts
import { Component, OnInit } from '@angular/core';
import { ExerciseService } from 'app/exercise.service';
import { ExerciseService } from 'services/exercise.service';
import { Exercise } from 'app/model/exercise';
import { Assignment } from 'app/model/assignment';
import { AssignmentService } from 'app/assignment.service';
import { AssignmentService } from 'services/assignment.service';
......@@ -22,18 +22,18 @@ export class ListExerciseComponent implements OnInit {
constructor(
private exerciseService: ExerciseService,
private assignmentService: AssignmentService // Injectez le service d'assignation
private assignmentService: AssignmentService
) {}
ngOnInit(): void {
// Récupérer la liste des exercices lors de l'initialisation du composant
this.exerciseService.getExercises().subscribe(exercises => {
this.exercises = exercises;
this.filteredExercises = this.exercises;
});
// Récupérer la liste des noms d'assignation lors de l'initialisation du composant
this.assignmentService.getAssignment().subscribe(assignments => {
this.assignmentService.getAssignments().subscribe(assignments => {
this.assignmentNames = assignments.map(assignment => assignment.name);
});
}
......
import { Component, OnInit } from '@angular/core';
import { AuthService } from "../auth_service";
import { AuthService } from "../../services/auth_service";
import { ActivatedRoute } from '@angular/router';
@Component({
......@@ -20,7 +20,9 @@ export class LoginComponent implements OnInit {
console.log('Code d\'autorisation récupéré :', code);
this.authService.exchangeCodeForToken(code);
const accessToken = this.authService.getAccessToken();
const refresh_token = this.authService.getRefreshToken();
console.log('Access token dans LoginComponent :', accessToken);
console.log('Refresh token dans LoginComponent :', refresh_token);
} else {
console.log('Aucun code d\'autorisation trouvé dans les queryParams.');
}
......
export interface Assignment {
name : string,
description : string,
language : string
gitLabId: string,
gitlabCreationInfo : string,
gitlabLastInfo : string,
gitlabLink : string,
gitlabLastInfoDate : string,
}
\ No newline at end of file
export interface Result {
exerciseId: string;
dateTime: string;
commit: any;
exitCode: number;
files: any;
results: any;
success: boolean;
}
......@@ -5,24 +5,40 @@
<div class="card">
<div class="card-header card-header-danger">
<h4 class="card-title ">Assignments</h4>
<p class="card-category"> Here is a subtitle for this table</p>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table">
<thead class=" text-primary">
<tr>
<th *ngFor="let h of headers">
{{h}}
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let row of rows">
<td *ngFor="let h of headers">
<a ng-href="#/{{row['link']}}">{{row[h]}}</a>
<tr *ngFor="let assignment of assignments">
<td>
<a *ngIf="assignment.published === 1" [routerLink]="['/exercise_from_assign', assignment.name]">
<i class="fa fa-eye"></i>
</a>
<ng-container *ngIf="assignment.published !== 1">
<i class="fa fa-eye" (click)="showUnpublishedPopup()"></i>
</ng-container>
</td>
<td>{{assignment.name}}</td>
<td>{{assignment.gitlabCreationInfo.description}}</td>
<td>{{assignment.gitlabCreationInfo.created_at | date:"dd MMM yyyy 'at' hh:mm"}}</td>
<td>{{assignment.gitlabLink}}</td>
<td>{{assignment.published === 1 ? 'Published' : 'Unpublished'}}</td>
<td>
<button class="btn btn-outline-danger" (click)="delAssignment(assignment.gitlabId)">Delete</button>
</td>
</tr>
</tbody>
</table>
<h1>{{ delStatus }}</h1>
</div>
</div>
</div>
......
import { Component, OnInit } from '@angular/core';
import { Assignment } from 'app/model/assignment';
import { AssignmentService } from 'services/assignment.service';
import { DatePipe } from '@angular/common';
@Component({
selector: 'app-table-list',
......@@ -6,35 +10,40 @@ import { Component, OnInit } from '@angular/core';
styleUrls: ['./table-list.component.css']
})
export class TableListComponent implements OnInit {
assignments : Assignment[] = []
data : [] = []
formattedDate : string
delStatus : string;
headers : string[] = ['Exercise Created', 'Name', 'Description', 'Creation date', 'gitlabLink', 'Status','Options'];
constructor() { }
constructor(private service : AssignmentService) { }
headers : string[] = ['Assignment', 'Description', 'Number of success', 'Exercises created'];
rows = [
{
'Assignment' : 'TCP',
'Description' : 'Technique de compilation',
'Number of success' : '2',
'Exercises created' : '4',
'Link' : 'exercise-page'
},
{
'Assignment' : 'Optimisation',
'Description' : 'Do some optimisation',
'Number of success' : '2',
'Exercises created' : '4',
'Link' : ''
},
{
'Assignment' : 'Advanced Programmation',
'Description' : 'Some programmation',
'Number of success' : '0',
'Exercises created' : '10',
'Link' : ''
delAssignment(id: number) {
console.log(id);
this.service.delAssignments(id).subscribe(
() => {
this.delStatus = 'Delete successful';
},
];
(error) => {
console.error('Error deleting assignment:', error);
this.delStatus = 'Delete failed';
}
);
}
ngOnInit() {
this.service.getAssignments().subscribe((assignment) => {
this.assignments = assignment
for (let i = 0; i < this.assignments.length; i++) {
this.assignments[i].gitlabCreationInfo = JSON.parse(assignment[i].gitlabCreationInfo)
this.assignments[i].gitlabLastInfo = JSON.parse(assignment[i].gitlabLastInfo)
}
console.log(this.assignments[0].gitlabCreationInfo)
})
}
showUnpublishedPopup() {
alert('Aucun Exercice utilise cet énoncé car il n\'est pas publié.');
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment