Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exam mode: Visualize student submissions in exam timeline #6882

Merged
merged 118 commits into from
Oct 21, 2023
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
caa1767
initial user interface
tobias-lippert Jul 1, 2023
12af27e
continue implementation
tobias-lippert Jul 2, 2023
eb425a0
continue implementation
tobias-lippert Jul 2, 2023
bacb5e8
continue implementation
tobias-lippert Jul 3, 2023
0a78175
debug logs
tobias-lippert Jul 5, 2023
ec0ba92
try to make it work for modeling
tobias-lippert Jul 7, 2023
aad9cdd
file upload
tobias-lippert Jul 8, 2023
41a5c3a
continue implementation
tobias-lippert Jul 8, 2023
f90b208
make it work for everything besides programming and start writing tests
tobias-lippert Jul 8, 2023
c477d9f
write server test and start writing client tests
tobias-lippert Jul 9, 2023
4a48b0b
write student exam timeline client tests
tobias-lippert Jul 11, 2023
f97afbc
fix probably flaky tests
tobias-lippert Jul 11, 2023
a65f410
remove unnecessary method
tobias-lippert Jul 11, 2023
97e82c8
add jsdoc
tobias-lippert Jul 11, 2023
3fc5c7f
write more client tests
tobias-lippert Jul 12, 2023
4cc8b41
remove debug logs and unnecessary methods and attributes
tobias-lippert Jul 12, 2023
202021c
remove unused methods on the server side
tobias-lippert Jul 12, 2023
8eaed92
remove more unintended changes
tobias-lippert Jul 12, 2023
b0c550c
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 12, 2023
32856b5
add test case for exam navigation bar
tobias-lippert Jul 12, 2023
6fafa4f
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 13, 2023
f5c4e1f
address code review comments
tobias-lippert Jul 14, 2023
ab694d5
review unused services in test class
tobias-lippert Jul 14, 2023
992eb0a
fix ngSwitchCase and tooltip
tobias-lippert Jul 14, 2023
6490a06
remove hardcoded user name for demo purposes
tobias-lippert Jul 14, 2023
8235f97
fix remaining comments
tobias-lippert Jul 14, 2023
7d565ec
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 21, 2023
5b63f8e
Fix flaky modeling assessment component tests
pal03377 Jul 21, 2023
be64589
Use new ApollonEditor.nextRender promise to fix code and tests
pal03377 Jul 22, 2023
fa2db23
Merge branch 'develop' into fix/flaky-modeling-assessment-tests
pal03377 Jul 22, 2023
915a9f9
Change package to @palsch/apollon to be able to test the PR
pal03377 Jul 22, 2023
39f0335
Install @palsch/apollon for testing
pal03377 Jul 22, 2023
464dd5a
minimize changes to package-lock.json
pal03377 Jul 22, 2023
8e57b5a
update Apollon package again
pal03377 Jul 22, 2023
fe34dc1
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 24, 2023
264fa30
add empty line before method and remove empty line at the end of the …
tobias-lippert Jul 24, 2023
0309c76
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 24, 2023
c9add94
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 25, 2023
6816e12
split up services and avoid jumping between submissions if the same e…
tobias-lippert Jul 27, 2023
4c0e97a
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 27, 2023
cacdd5a
fix test
tobias-lippert Jul 27, 2023
0d750ba
remove unused service
tobias-lippert Jul 28, 2023
a64774b
fix retrieving all submissions
tobias-lippert Jul 31, 2023
680a2f6
Merge branch 'fix/flaky-modeling-assessment-tests' into feature/exam-…
tobias-lippert Jul 31, 2023
a1c3c5e
fix apollon editor state undefined with pauls fix
tobias-lippert Jul 31, 2023
06ad8f8
fix breadcrumb
tobias-lippert Jul 31, 2023
3709d32
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Jul 31, 2023
b26db7a
Merge branch 'develop' into fix/flaky-modeling-assessment-tests
pal03377 Aug 3, 2023
d3b7271
Fix tests again by awaiting in more places
pal03377 Aug 3, 2023
cbb78e4
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Aug 7, 2023
8b46e2d
Merge branch 'develop' into fix/flaky-modeling-assessment-tests
pal03377 Aug 7, 2023
a9e075a
Merge branch 'develop' into fix/flaky-modeling-assessment-tests
pal03377 Aug 10, 2023
22f0a7f
small improvements
tobias-lippert Aug 11, 2023
f360e51
fix to not prevent merge
tobias-lippert Aug 24, 2023
aa940ce
fix to not prevent merge
tobias-lippert Aug 24, 2023
f55faf6
merge
tobias-lippert Aug 24, 2023
2ff4136
add npm dependency changes again
tobias-lippert Aug 24, 2023
ff4afc4
fix test
tobias-lippert Aug 24, 2023
9b4999d
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Aug 25, 2023
7449b84
use DTO for newly introduced endpoint
tobias-lippert Aug 25, 2023
14cae2f
fix test
tobias-lippert Aug 25, 2023
7a6a1eb
show exercise and not exercise group name
tobias-lippert Aug 25, 2023
6010278
Merge branch 'fix/flaky-modeling-assessment-tests' into feature/exam-…
tobias-lippert Aug 26, 2023
b3815d1
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Aug 26, 2023
4f81d09
Merge branch 'develop' into fix/flaky-modeling-assessment-tests
pal03377 Aug 27, 2023
de2ccfc
update palsch/apollon version
pal03377 Aug 27, 2023
abf90d4
Merge branch 'fix/flaky-modeling-assessment-tests' into feature/exam-…
tobias-lippert Aug 28, 2023
fc31ffc
update package-lock.json after merge
tobias-lippert Aug 28, 2023
89de6ba
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Aug 29, 2023
573ca07
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 2, 2023
a49af25
revert unintended route change
tobias-lippert Sep 2, 2023
dfcb85a
remove unused param in event emitter
tobias-lippert Sep 2, 2023
805e528
import fixes in production code after merge
tobias-lippert Sep 3, 2023
01b1254
import fixes in test code after merge
tobias-lippert Sep 3, 2023
9c7667a
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 4, 2023
7968bbb
first part of review comments
tobias-lippert Sep 4, 2023
10d9a2c
second part of review comments
tobias-lippert Sep 5, 2023
01f4a15
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 8, 2023
05529de
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 9, 2023
445547c
fix compile error after merge
tobias-lippert Sep 12, 2023
3176a94
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 12, 2023
ce78ac2
fixes after merge
tobias-lippert Sep 14, 2023
b340b38
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 14, 2023
7abec04
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 15, 2023
e863926
fixes after merge
tobias-lippert Sep 15, 2023
fd301a2
Merge remote-tracking branch 'origin/feature/exam-timeline' into feat…
tobias-lippert Sep 15, 2023
6e2dc48
rename dtos to better reflect their content
tobias-lippert Sep 16, 2023
b51d8f2
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 16, 2023
0c879b1
Exam mode: Show diff and commit info for programming exercises in exa…
tobias-lippert Sep 18, 2023
56dcb8d
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 21, 2023
3dba019
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 27, 2023
facef00
fixes after merge
tobias-lippert Sep 28, 2023
2acd06e
mock less but instead really commit something in the local repository…
tobias-lippert Sep 28, 2023
c7db707
fix other tests
tobias-lippert Sep 28, 2023
4a07347
remove unused code
tobias-lippert Sep 28, 2023
e3b15ac
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Sep 29, 2023
0383561
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 8, 2023
695b7f6
fixes after merge
tobias-lippert Oct 8, 2023
3958062
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 10, 2023
08cb81d
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 11, 2023
086ced7
Merge branch 'develop' into feature/exam-timeline
krusche Oct 14, 2023
ca821af
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 15, 2023
000aad4
Merge remote-tracking branch 'origin/feature/exam-timeline' into feat…
tobias-lippert Oct 15, 2023
22dd3d5
fixes after merge
tobias-lippert Oct 15, 2023
c3fe0cf
fix jest config
tobias-lippert Oct 15, 2023
0a73e28
fix client test and undefined error
tobias-lippert Oct 15, 2023
5b298ce
fix displaying of wrong title
tobias-lippert Oct 15, 2023
e4b2c5a
prevent undefined error
tobias-lippert Oct 15, 2023
4647480
add debug log
tobias-lippert Oct 15, 2023
e871bb3
add correct debug log
tobias-lippert Oct 15, 2023
0dab280
handle empty text submission
tobias-lippert Oct 15, 2023
a056499
remove debug log
tobias-lippert Oct 15, 2023
908e572
move exam timeline button to exam summary
tobias-lippert Oct 15, 2023
8e57cd0
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 15, 2023
7a86fc6
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 17, 2023
419ff5a
Merge branch 'develop' into feature/exam-timeline
tobias-lippert Oct 17, 2023
0d50267
Merge branch 'develop' into feature/exam-timeline
dependabot-test Oct 18, 2023
6a1149e
fix import
dependabot-test Oct 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const esModules = ['lodash-es', 'franc-min', 'trigram-utils', 'n-gram', 'collaps
'@ngx-translate/core', '@ngx-translate/http-loader', '@fortawesome/angular-fontawesome', '@angular/cdk', '@angular/material', '@angular/cdk', 'dayjs/esm',
'rxjs/operators', '@ng-bootstrap/ng-bootstrap', 'ngx-webstorage', '@ctrl/ngx-emoji-mart', 'ngx-device-detector', '@swimlane/ngx-charts',
'@angular/service-worker', '@danielmoncada/angular-datetime-picker', '@flaviosantoro92/ngx-datatable', 'd3-color', 'd3-interpolate', 'd3-transition', 'd3-brush',
'd3-drag', 'd3-selection', 'd3-scale', 'd3-array', 'd3-format', 'd3-shape', 'd3-path', 'd3-ease', 'd3-time', 'd3-hierarchy', 'ngx-infinite-scroll', 'internmap'].join('|');
'd3-drag', 'd3-selection', 'd3-scale', 'd3-array', 'd3-format', 'd3-shape', 'd3-path', 'd3-ease', 'd3-time', 'd3-hierarchy', 'ngx-infinite-scroll', 'internmap', 'ngx-slider-v2'].join('|');

const {
compilerOptions: { baseUrl = './' },
Expand Down
29 changes: 29 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@angular/platform-browser-dynamic": "16.1.3",
"@angular/router": "16.1.3",
"@angular/service-worker": "16.1.3",
"ngx-slider-v2": "16.0.2",
tobias-lippert marked this conversation as resolved.
Show resolved Hide resolved
"@ctrl/ngx-emoji-mart": "9.2.0",
"@danielmoncada/angular-datetime-picker": "16.0.1",
"@fingerprintjs/fingerprintjs": "3.4.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -440,4 +440,8 @@ default Submission findOneWithEagerResultAndFeedback(long submissionId) {
default Submission findByIdWithResultsElseThrow(long submissionId) {
return findWithEagerResultsAndAssessorById(submissionId).orElseThrow(() -> new EntityNotFoundException("Submission", +submissionId));
}

default Submission findByIdElseThrow(long submissionId) {
return findById(submissionId).orElseThrow(() -> new EntityNotFoundException("Submission", +submissionId));
tobias-lippert marked this conversation as resolved.
Show resolved Hide resolved
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.tum.in.www1.artemis.repository;

import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -18,4 +19,6 @@ public interface SubmissionVersionRepository extends JpaRepository<SubmissionVer
@Query("select version from SubmissionVersion version left join version.submission submission left join submission.versions where submission.id = :#{#submissionId} and version.id = (select max(id) from submission.versions)")
Optional<SubmissionVersion> findLatestVersion(@Param("submissionId") long submissionId);

List<SubmissionVersion> findSubmissionVersionBySubmissionIdOrderByCreatedDateAsc(long submissionId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ public ResponseEntity<ModelingSubmission> getModelingSubmission(@PathVariable Lo
@GetMapping(value = "/exercises/{exerciseId}/modeling-submission-without-assessment")
@EnforceAtLeastTutor
public ResponseEntity<ModelingSubmission> getModelingSubmissionWithoutAssessment(@PathVariable Long exerciseId,
@RequestParam(value = "lock", defaultValue = "false") boolean lockSubmission, @RequestParam(value = "correction-round", defaultValue = "0") int correctionRound) {
@RequestParam(value = "lock", defaultValue = "false") boolean lockSubmission, @RequestParam(value = "correction-round", defaultValue = "0") int correctionRound) {

log.debug("REST request to get a modeling submission without assessment");
final var exercise = exerciseRepository.findByIdElseThrow(exerciseId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ public class SubmissionResource {

private final BuildLogStatisticsEntryRepository buildLogStatisticsEntryRepository;

private final SubmissionVersionRepository submissionVersionRepository;

public SubmissionResource(SubmissionService submissionService, SubmissionRepository submissionRepository, BuildLogEntryService buildLogEntryService,
ResultService resultService, StudentParticipationRepository studentParticipationRepository, AuthorizationCheckService authCheckService, UserRepository userRepository,
ExerciseRepository exerciseRepository, BuildLogStatisticsEntryRepository buildLogStatisticsEntryRepository) {
ExerciseRepository exerciseRepository, BuildLogStatisticsEntryRepository buildLogStatisticsEntryRepository, SubmissionVersionRepository submissionVersionRepository) {
this.submissionService = submissionService;
this.submissionRepository = submissionRepository;
this.buildLogEntryService = buildLogEntryService;
Expand All @@ -71,6 +73,7 @@ public SubmissionResource(SubmissionService submissionService, SubmissionReposit
this.authCheckService = authCheckService;
this.userRepository = userRepository;
this.buildLogStatisticsEntryRepository = buildLogStatisticsEntryRepository;
this.submissionVersionRepository = submissionVersionRepository;
}

/**
Expand Down Expand Up @@ -109,7 +112,7 @@ public ResponseEntity<Void> deleteSubmission(@PathVariable Long submissionId) {

/**
* GET /test-run-submissions : get test run submission for an exercise.
*
* <p>
* Only returns the users test run submission for a specific exercise
*
* @param exerciseId exerciseID for which all submissions should be returned
Expand Down Expand Up @@ -145,7 +148,7 @@ public ResponseEntity<List<Submission>> getTestRunSubmissionsForAssessment(@Path

/**
* Get /exercises/:exerciseId/submissions-with-complaints
*
* <p>
* Get all submissions associated to an exercise which have complaints in,
* but filter out the ones that are about the tutor who is doing the request, since tutors cannot act on their own complaint
* Additionally, filter out the ones where the student is the same as the assessor as this indicated that this is a test run.
Expand All @@ -166,7 +169,7 @@ public ResponseEntity<List<SubmissionWithComplaintDTO>> getSubmissionsWithCompla

/**
* Get /exercises/:exerciseId//more-feedback-requests-with-complaints
*
* <p>
* Get all more feedback requests associated to an exercise which have more feedback requests in,
* but filter out the ones that are about the tutor who is doing the request, since tutors cannot act on their own complaint
* Additionally, filter out the ones where the student is the same as the assessor as this indicated that this is a test run.
Expand Down Expand Up @@ -221,4 +224,12 @@ private Course findCourseFromSubmission(Submission submission) {

return studentParticipationRepository.findByIdElseThrow(participation.getId()).getExercise().getCourseViaExerciseGroupOrCourseMember();
}

@GetMapping("/submissions/{submissionId}/versions")
@EnforceAtLeastInstructor
public List<SubmissionVersion> getSubmissionVersions(@PathVariable long submissionId) {
var submission = submissionRepository.findByIdElseThrow(submissionId);
authCheckService.checkHasAtLeastRoleForExerciseElseThrow(Role.INSTRUCTOR, submission.getParticipation().getExercise(), userRepository.getUser());
return submissionVersionRepository.findSubmissionVersionBySubmissionIdOrderByCreatedDateAsc(submission.getId());
}
}
10 changes: 10 additions & 0 deletions src/main/webapp/app/entities/submission-version.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { BaseEntity } from 'app/shared/model/base-entity';
import { Submission } from 'app/entities/submission.model';
import dayjs from 'dayjs/esm';

export class SubmissionVersion implements BaseEntity {
public id?: number;
public submission: Submission;
public createdDate: dayjs.Dayjs;
public content: string;
}
9 changes: 8 additions & 1 deletion src/main/webapp/app/exam/manage/exam-management.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,11 @@ import { ExamExerciseImportComponent } from 'app/exam/manage/exams/exam-exercise
import { FeatureToggleModule } from 'app/shared/feature-toggle/feature-toggle.module';
import { BonusComponent } from 'app/grading-system/bonus/bonus.component';
import { ArtemisModePickerModule } from 'app/exercises/shared/mode-picker/mode-picker.module';
import { StudentExamTimelineComponent } from './student-exams/student-exam-timeline/student-exam-timeline.component';
import { TitleChannelNameModule } from 'app/shared/form/title-channel-name/title-channel-name.module';

import { ArtemisExamNavigationBarModule } from 'app/exam/participate/exam-navigation-bar/exam-navigation-bar.module';
import { ArtemisExamSubmissionComponentsModule } from 'app/exam/participate/exercises/exam-submission-components.module';
import { NgxSliderModule } from 'ngx-slider-v2';
const ENTITY_STATES = [...examManagementState];

@NgModule({
Expand Down Expand Up @@ -87,6 +90,9 @@ const ENTITY_STATES = [...examManagementState];
ArtemisModePickerModule,
StudentsUploadImagesModule,
TitleChannelNameModule,
ArtemisExamNavigationBarModule,
ArtemisExamSubmissionComponentsModule,
NgxSliderModule,
],
declarations: [
ExamManagementComponent,
Expand Down Expand Up @@ -115,6 +121,7 @@ const ENTITY_STATES = [...examManagementState];
ExamImportComponent,
ExamExerciseImportComponent,
BonusComponent,
StudentExamTimelineComponent,
],
})
export class ArtemisExamManagementModule {}
15 changes: 14 additions & 1 deletion src/main/webapp/app/exam/manage/exam-management.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import { FileUploadExerciseManagementResolve } from 'app/exercises/file-upload/m
import { ModelingExerciseResolver } from 'app/exercises/modeling/manage/modeling-exercise-resolver.service';
import { ExamResolve, ExerciseGroupResolve, StudentExamResolve } from 'app/exam/manage/exam-management-resolve.service';
import { BonusComponent } from 'app/grading-system/bonus/bonus.component';
import { StudentExamTimelineComponent } from 'app/exam/manage/student-exams/student-exam-timeline/student-exam-timeline.component';

export const examManagementRoute: Routes = [
{
Expand Down Expand Up @@ -276,6 +277,18 @@ export const examManagementRoute: Routes = [
},
canActivate: [UserRouteAccessService],
},
{
path: ':examId/student-exams/:studentExamId/timeline',
component: StudentExamTimelineComponent,
resolve: {
studentExam: StudentExamResolve,
},
data: {
authorities: [Authority.INSTRUCTOR, Authority.ADMIN],
pageTitle: 'artemisApp.examManagement.title',
},
canActivate: [UserRouteAccessService],
},
{
path: ':examId/student-exams/:studentExamId/summary/overview/grading-key',
component: GradingKeyOverviewComponent,
Expand Down Expand Up @@ -307,7 +320,7 @@ export const examManagementRoute: Routes = [
},
{
path: ':examId/test-runs/:studentExamId/summary',
component: StudentExamSummaryComponent,
component: StudentExamTimelineComponent,
resolve: {
studentExam: StudentExamResolve,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,32 @@ <h4 *ngIf="isTestRun" class="mb-0" jhiTranslate="artemisApp.studentExamDetail.te
<br />
<div *ngIf="student && studentExam">
<div class="mb-3">
<h5><span jhiTranslate="artemisApp.studentExamDetail.student">Student</span></h5>
<ol class="indented-list">
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.name">Name:</strong>
{{ student.name }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.login">Login:</strong>
{{ student.login }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.email">Email:</strong>
{{ student.email }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.matriculationNumber">Matriculation number:</strong>
{{ student.visibleRegistrationNumber }}
</li>
</ol>
<div class="col d-flex">
<div class="row d-flex col-md-5">
<h5><span jhiTranslate="artemisApp.studentExamDetail.student">Student</span></h5>
<ol class="indented-list">
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.name">Name:</strong>
{{ student.name }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.login">Login:</strong>
{{ student.login }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.email">Email:</strong>
{{ student.email }}
</li>
<li>
<strong jhiTranslate="artemisApp.studentExamDetail.matriculationNumber">Matriculation number:</strong>
{{ student.visibleRegistrationNumber }}
</li>
</ol>
</div>
<a *ngIf="course?.isAtLeastInstructor && studentExam.submitted" class="btn btn-primary mb-auto pl-5" [routerLink]="'./timeline'">
<span jhiTranslate="artemisApp.studentExams.examTimeline">Timeline</span>
</a>
</div>
</div>

<div class="mb-3" *ngIf="!isTestExam">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<h4 class="mb-4" jhiTranslate="artemisApp.timeline.title" [translateValues]="{ username: studentExam.user!.login! }">Exam timeline</h4>
<div *ngIf="studentExam">
<ngx-slider class="mb-5" #slider [(value)]="value" [options]="options" (userChange)="onInputChange($event)"></ngx-slider>
<jhi-exam-navigation-bar
#examNavigationBar
id="exam-navigation-bar"
class="sticky-top d-block"
[exercises]="studentExam?.exercises!"
[exerciseIndex]="exerciseIndex"
[examTimeLineView]="true"
(onPageChanged)="onPageChange($event)"
></jhi-exam-navigation-bar>
<!-- exercises -->
<ng-container *ngFor="let exercise of studentExam.exercises; let i = index">
<ng-container *ngIf="exercise && exercise.studentParticipations && exercise.studentParticipations[0]">
<ng-container *ngIf="pageComponentVisited[i]">
<ng-container [ngSwitch]="exercise.type">
<div [hidden]="i !== activePageIndex" [id]="'exercise-' + exercise.id">
pal03377 marked this conversation as resolved.
Show resolved Hide resolved
<jhi-quiz-submission-exam
*ngSwitchCase="QUIZ"
[exercise]="exercise"
[studentSubmission]="exercise.studentParticipations[0].submissions![0]"
[readonly]="true"
[examTimeline]="true"
></jhi-quiz-submission-exam>
<jhi-file-upload-submission-exam
*ngSwitchCase="FILEUPLOAD"
[exercise]="exercise"
[studentSubmission]="exercise.studentParticipations[0].submissions![0]"
[readonly]="true"
[examTimeline]="true"
></jhi-file-upload-submission-exam>
<jhi-text-editor-exam
*ngSwitchCase="TEXT"
[exercise]="exercise"
[studentSubmission]="exercise.studentParticipations[0].submissions![0]"
[readonly]="true"
[examTimeline]="true"
></jhi-text-editor-exam>
<jhi-modeling-submission-exam
*ngSwitchCase="MODELING"
[exercise]="exercise"
[studentSubmission]="exercise.studentParticipations[0].submissions![0]"
[readonly]="true"
[examTimeline]="true"
></jhi-modeling-submission-exam>
<jhi-programming-submission-exam
*ngSwitchCase="PROGRAMMING"
[exercise]="exercise"
[studentParticipation]="exercise.studentParticipations[0]"
[courseId]="courseId"
[readonly]="true"
[examTimeline]="true"
></jhi-programming-submission-exam>
</div>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
</div>
Loading