Loading src/app/courses/course-import/course-import.component.ts +1 −1 Original line number Original line Diff line number Diff line Loading @@ -110,7 +110,7 @@ export class CourseImportComponent implements OnInit, OnDestroy { () => { () => { this.router.navigateByUrl(`/courses/${target.id}`).then( this.router.navigateByUrl(`/courses/${target.id}`).then( () => { () => { this.flashMessagesService.show('Import successful.', {cssClass: 'alert-sucess'}); this.flashMessagesService.show('Import successful.', {cssClass: 'alert-success'}); } } ); ); } } Loading src/app/services/permissions.service.ts +0 −30 Original line number Original line Diff line number Diff line Loading @@ -31,33 +31,3 @@ export class PermissionsService { } } } } /* export class Permissions { constructor(public archive_projects: boolean, public assign_roles: boolean, public create_submissions: boolean, public evaluate_submissions: boolean, public handle_notes_access_token: boolean, public read_all_submission_files: boolean, public read_groups: boolean, public read_projects: boolean, public read_reviews_all: boolean, public read_reviews_groups: boolean, public read_reviews_own: boolean, public read_roles: boolean, public read_submissions_all: boolean, public read_submissions_groups: boolean, public read_submissions_own: boolean, public resubmit_submissions: boolean, public update_course: boolean, public view_course_full: boolean, public view_course_limited: boolean, public write_groups: boolean, public write_projects: boolean, public write_reviews_all: boolean, public write_reviews_group: boolean, public write_reviews_own: boolean, public write_roles: boolean) { } } */ src/app/services/submission.service.ts +5 −11 Original line number Original line Diff line number Diff line Loading @@ -29,17 +29,11 @@ export class SubmissionService { } } public cancelSubmission(id: string) { public cancelSubmission(id: string) { return this.http.put(`${this.submissionsUrl}/${id}/state`, {'state': 'CANCELLED'}); return this.http.put(`${this.submissionsUrl}/${id}/state`, { state: 'CANCELLED'}); } } } /* public resubmitSubmission(id: string, note: string) { file_params = { return this.http.post(`${this.submissionsUrl}/${id}/resubmit`, { note: note}); source: { type url branch checkout } } } } project_params */ src/app/submissions/submission-detail/submission-detail.component.html +31 −1 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,10 @@ class="btn btn-danger fa-pull-right" (click)="cancelSubmission()" style="margin-right: 15px"> class="btn btn-danger fa-pull-right" (click)="cancelSubmission()" style="margin-right: 15px"> Cancel submission processing Cancel submission processing </button> </button> <button *ngIf="!['CANCELLED', 'CREATED'].includes(submission.state) && userCanResubmitSubmission()" class="btn btn-warning fa-pull-right" data-toggle="modal" data-target="#resubmit_submission_modal" style="margin-right: 15px"> Resubmit </button> <button *ngIf="loggedInUser?.is_admin" style="margin-right: 15px" <button *ngIf="loggedInUser?.is_admin" style="margin-right: 15px" data-toggle="modal" data-target="#delete_submission_modal" class="btn btn-danger fa-pull-right"> data-toggle="modal" data-target="#delete_submission_modal" class="btn btn-danger fa-pull-right"> Delete Delete Loading Loading @@ -46,7 +50,6 @@ </div> </div> <div *ngIf="(loggedInUser?.is_admin)"> <div *ngIf="(loggedInUser?.is_admin)"> <div id="delete_submission_modal" class="modal" tabindex="-1" role="dialog"> <div id="delete_submission_modal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-content"> Loading @@ -70,3 +73,30 @@ </div> </div> </div> </div> </div> </div> <div *ngIf="userCanResubmitSubmission()"> <div id="resubmit_submission_modal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Resubmit submission</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p> Do you wish to resubmit submission: <strong>{{submission?.id}}</strong> from course {{submission?.project?.course?.codename}} authored by {{submission?.user?.username}}? The submission's author will be its original author. </p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal" (click)="resubmitSubmission()">Yes</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button> </div> </div> </div> </div> </div> </div> src/app/submissions/submission-detail/submission-detail.component.ts +25 −1 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,7 @@ import {Submission, User} from '../../shared/models/models'; import {Subscription} from 'rxjs/Subscription'; import {Subscription} from 'rxjs/Subscription'; import {FlashMessagesService} from 'angular2-flash-messages'; import {FlashMessagesService} from 'angular2-flash-messages'; import {SubmissionService} from '../../services/submission.service'; import {SubmissionService} from '../../services/submission.service'; import {PermissionsService} from '../../services/permissions.service'; @Component({ @Component({ selector: 'app-submission-detail', selector: 'app-submission-detail', Loading @@ -18,7 +19,9 @@ export class SubmissionDetailComponent implements OnInit, OnDestroy { constructor(private route: ActivatedRoute, constructor(private route: ActivatedRoute, private router: Router, private router: Router, private flashMessagesService: FlashMessagesService, private flashMessagesService: FlashMessagesService, private submissionService: SubmissionService) { private submissionService: SubmissionService, private permissionsService: PermissionsService ) { } } ngOnInit() { ngOnInit() { Loading Loading @@ -61,7 +64,28 @@ export class SubmissionDetailComponent implements OnInit, OnDestroy { )); )); } } resubmitSubmission() { const note = `Resubmitted at ${Date.now()} by ${this.loggedInUser.username} (id ${this.loggedInUser.id})`; this.subscriptions.push(this.submissionService.resubmitSubmission(this.submission.id, note).subscribe( (submission: Submission) => { this.router.navigateByUrl(`/submissions/${submission.id}`).then( () => { this.flashMessagesService.show('Resubmit successful.', {cssClass: 'alert-success'}); }, (error: any) => { console.log('Navigation failed: ', error); this.flashMessagesService.show('Navigation failed, try navigating elsewhere.', {cssClass: 'alert-danger'}); } ); } )); } userCanCancelSubmission(): boolean { userCanCancelSubmission(): boolean { return this.loggedInUser.is_admin || this.loggedInUser === this.submission.user; return this.loggedInUser.is_admin || this.loggedInUser === this.submission.user; } } userCanResubmitSubmission(): boolean { return this.loggedInUser.is_admin || this.permissionsService.checkAll(this.loggedInUser.permissions[this.submission.project.course.id], ['resubmit_submissions']); } } } Loading
src/app/courses/course-import/course-import.component.ts +1 −1 Original line number Original line Diff line number Diff line Loading @@ -110,7 +110,7 @@ export class CourseImportComponent implements OnInit, OnDestroy { () => { () => { this.router.navigateByUrl(`/courses/${target.id}`).then( this.router.navigateByUrl(`/courses/${target.id}`).then( () => { () => { this.flashMessagesService.show('Import successful.', {cssClass: 'alert-sucess'}); this.flashMessagesService.show('Import successful.', {cssClass: 'alert-success'}); } } ); ); } } Loading
src/app/services/permissions.service.ts +0 −30 Original line number Original line Diff line number Diff line Loading @@ -31,33 +31,3 @@ export class PermissionsService { } } } } /* export class Permissions { constructor(public archive_projects: boolean, public assign_roles: boolean, public create_submissions: boolean, public evaluate_submissions: boolean, public handle_notes_access_token: boolean, public read_all_submission_files: boolean, public read_groups: boolean, public read_projects: boolean, public read_reviews_all: boolean, public read_reviews_groups: boolean, public read_reviews_own: boolean, public read_roles: boolean, public read_submissions_all: boolean, public read_submissions_groups: boolean, public read_submissions_own: boolean, public resubmit_submissions: boolean, public update_course: boolean, public view_course_full: boolean, public view_course_limited: boolean, public write_groups: boolean, public write_projects: boolean, public write_reviews_all: boolean, public write_reviews_group: boolean, public write_reviews_own: boolean, public write_roles: boolean) { } } */
src/app/services/submission.service.ts +5 −11 Original line number Original line Diff line number Diff line Loading @@ -29,17 +29,11 @@ export class SubmissionService { } } public cancelSubmission(id: string) { public cancelSubmission(id: string) { return this.http.put(`${this.submissionsUrl}/${id}/state`, {'state': 'CANCELLED'}); return this.http.put(`${this.submissionsUrl}/${id}/state`, { state: 'CANCELLED'}); } } } /* public resubmitSubmission(id: string, note: string) { file_params = { return this.http.post(`${this.submissionsUrl}/${id}/resubmit`, { note: note}); source: { type url branch checkout } } } } project_params */
src/app/submissions/submission-detail/submission-detail.component.html +31 −1 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,10 @@ class="btn btn-danger fa-pull-right" (click)="cancelSubmission()" style="margin-right: 15px"> class="btn btn-danger fa-pull-right" (click)="cancelSubmission()" style="margin-right: 15px"> Cancel submission processing Cancel submission processing </button> </button> <button *ngIf="!['CANCELLED', 'CREATED'].includes(submission.state) && userCanResubmitSubmission()" class="btn btn-warning fa-pull-right" data-toggle="modal" data-target="#resubmit_submission_modal" style="margin-right: 15px"> Resubmit </button> <button *ngIf="loggedInUser?.is_admin" style="margin-right: 15px" <button *ngIf="loggedInUser?.is_admin" style="margin-right: 15px" data-toggle="modal" data-target="#delete_submission_modal" class="btn btn-danger fa-pull-right"> data-toggle="modal" data-target="#delete_submission_modal" class="btn btn-danger fa-pull-right"> Delete Delete Loading Loading @@ -46,7 +50,6 @@ </div> </div> <div *ngIf="(loggedInUser?.is_admin)"> <div *ngIf="(loggedInUser?.is_admin)"> <div id="delete_submission_modal" class="modal" tabindex="-1" role="dialog"> <div id="delete_submission_modal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-content"> Loading @@ -70,3 +73,30 @@ </div> </div> </div> </div> </div> </div> <div *ngIf="userCanResubmitSubmission()"> <div id="resubmit_submission_modal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Resubmit submission</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p> Do you wish to resubmit submission: <strong>{{submission?.id}}</strong> from course {{submission?.project?.course?.codename}} authored by {{submission?.user?.username}}? The submission's author will be its original author. </p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal" (click)="resubmitSubmission()">Yes</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button> </div> </div> </div> </div> </div> </div>
src/app/submissions/submission-detail/submission-detail.component.ts +25 −1 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,7 @@ import {Submission, User} from '../../shared/models/models'; import {Subscription} from 'rxjs/Subscription'; import {Subscription} from 'rxjs/Subscription'; import {FlashMessagesService} from 'angular2-flash-messages'; import {FlashMessagesService} from 'angular2-flash-messages'; import {SubmissionService} from '../../services/submission.service'; import {SubmissionService} from '../../services/submission.service'; import {PermissionsService} from '../../services/permissions.service'; @Component({ @Component({ selector: 'app-submission-detail', selector: 'app-submission-detail', Loading @@ -18,7 +19,9 @@ export class SubmissionDetailComponent implements OnInit, OnDestroy { constructor(private route: ActivatedRoute, constructor(private route: ActivatedRoute, private router: Router, private router: Router, private flashMessagesService: FlashMessagesService, private flashMessagesService: FlashMessagesService, private submissionService: SubmissionService) { private submissionService: SubmissionService, private permissionsService: PermissionsService ) { } } ngOnInit() { ngOnInit() { Loading Loading @@ -61,7 +64,28 @@ export class SubmissionDetailComponent implements OnInit, OnDestroy { )); )); } } resubmitSubmission() { const note = `Resubmitted at ${Date.now()} by ${this.loggedInUser.username} (id ${this.loggedInUser.id})`; this.subscriptions.push(this.submissionService.resubmitSubmission(this.submission.id, note).subscribe( (submission: Submission) => { this.router.navigateByUrl(`/submissions/${submission.id}`).then( () => { this.flashMessagesService.show('Resubmit successful.', {cssClass: 'alert-success'}); }, (error: any) => { console.log('Navigation failed: ', error); this.flashMessagesService.show('Navigation failed, try navigating elsewhere.', {cssClass: 'alert-danger'}); } ); } )); } userCanCancelSubmission(): boolean { userCanCancelSubmission(): boolean { return this.loggedInUser.is_admin || this.loggedInUser === this.submission.user; return this.loggedInUser.is_admin || this.loggedInUser === this.submission.user; } } userCanResubmitSubmission(): boolean { return this.loggedInUser.is_admin || this.permissionsService.checkAll(this.loggedInUser.permissions[this.submission.project.course.id], ['resubmit_submissions']); } } }