Loading src/app/core/core.module.ts +33 −29 Original line number Diff line number Diff line import {NgModule, Optional, SkipSelf} from '@angular/core'; import {CommonModule, DatePipe} from '@angular/common'; import {ReactiveFormsModule} from '@angular/forms'; import {HttpClientModule} from '@angular/common/http'; import {JwtModule} from '@auth0/angular-jwt'; import {RouterModule} from '@angular/router'; import { NgModule, Optional, SkipSelf } from '@angular/core'; import { CommonModule, DatePipe } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { JwtModule } from '@auth0/angular-jwt'; import { RouterModule } from '@angular/router'; import { FlashMessagesModule } from 'angular2-flash-messages'; import {AuthService} from '../services/auth.service'; import {UserService} from '../services/user.service'; import { AuthService } from '../services/auth.service'; import { UserService } from '../services/user.service'; import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; import {AuthModule} from '../auth/auth.module'; import {CoreRoutingModule} from './core-routing.module'; import {SharedModule} from '../shared/shared.module'; import {CourseService} from '../services/course.service'; import {BaseLayoutComponent} from './base-layout/base-layout.component'; import {DashboardComponent} from './dashboard/dashboard.component'; import {environment} from '../../environments/environment'; import {UnauthenticatedGuard} from '../guards/unauthenticated.guard'; import {AuthenticatedGuard} from '../guards/authenticated.guard'; import {GitlabLoginGuard} from '../guards/gitlab-login.guard'; import {AdminGuard} from '../guards/admin.guard'; import {AdminOrOwnGuard} from '../guards/admin-or-own.guard'; import {ProjectService} from '../services/project.service'; import {LoggedInUserResolver} from '../resolvers/logged-in-user-resolver.service'; import {PermissionsService} from '../services/permissions.service'; import {SubmissionService} from '../services/submission.service'; import {AngularMultiSelectModule} from 'angular2-multiselect-dropdown'; import {CourseQueryParamResolver} from '../resolvers/course-query-param-resolver.service'; import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolver.service'; import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; import { AuthModule } from '../auth/auth.module'; import { CoreRoutingModule } from './core-routing.module'; import { SharedModule } from '../shared/shared.module'; import { CourseService } from '../services/course.service'; import { BaseLayoutComponent } from './base-layout/base-layout.component'; import { DashboardComponent } from './dashboard/dashboard.component'; import { environment } from '../../environments/environment'; import { UnauthenticatedGuard } from '../guards/unauthenticated.guard'; import { AuthenticatedGuard } from '../guards/authenticated.guard'; import { GitlabLoginGuard } from '../guards/gitlab-login.guard'; import { AdminGuard } from '../guards/admin.guard'; import { AdminOrOwnGuard } from '../guards/admin-or-own.guard'; import { ProjectService } from '../services/project.service'; import { LoggedInUserResolver } from '../resolvers/logged-in-user-resolver.service'; import { PermissionsService } from '../services/permissions.service'; import { SubmissionService } from '../services/submission.service'; import { AngularMultiSelectModule } from 'angular2-multiselect-dropdown'; import { CourseQueryParamResolver } from '../resolvers/course-query-param-resolver.service'; import { ProjectQueryParamResolver } from '../resolvers/project-query-param-resolver.service'; import { WorkerService } from '../services/worker.service'; import { SecretsModule } from '../secrets/secrets.module'; @NgModule({ imports: [ Loading @@ -47,7 +49,8 @@ import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolv AuthModule, CoreRoutingModule, AngularMultiSelectModule, SharedModule SharedModule, SecretsModule ], declarations: [ PageNotFoundComponent, Loading @@ -57,6 +60,7 @@ import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolv providers: [ AuthService, UserService, WorkerService, CourseService, ProjectService, PermissionsService, Loading src/app/courses/projects/project-config/project-config.component.ts +7 −6 Original line number Diff line number Diff line import { Component, Input, LOCALE_ID, OnInit } from '@angular/core'; import {Component, Input, OnInit} from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Project, ProjectConfig, User } from '../../../shared/models/models'; import { ProjectService } from '../../../services/project.service'; Loading Loading @@ -47,7 +47,8 @@ export class ProjectConfigComponent implements OnInit { } initFormValues() { const dateFormat = 'yyyy-MM-dd HH:mm'; // TODO: revamp date -> date, time, validate input this.configData.setValue({ testFilesSource: [ this.project.config.test_files_source ], fileWhitelist: [ this.project.config.file_whitelist ], Loading @@ -55,9 +56,9 @@ export class ProjectConfigComponent implements OnInit { postSubmitScript: [ this.project.config.post_submit_script ], submissionParameters: [ this.project.config.submission_parameters ], submissionSchedulerConfig: [ this.project.config.submission_scheduler_config ], submissionsAllowedFrom: [ this.datePipe.transform(this.project.config.submissions_allowed_from,) ], submissionsAllowedTo: [ this.datePipe.transform(this.project.config.submissions_allowed_to, 'yyyy-MM-ddTHH:mm') ], archiveFrom: [ this.datePipe.transform(this.project.config.archive_from, 'yyyy-MM-ddTHH:mm') ] submissionsAllowedFrom: [ this.datePipe.transform(this.project.config.submissions_allowed_from, dateFormat) ], submissionsAllowedTo: [ this.datePipe.transform(this.project.config.submissions_allowed_to, dateFormat) ], archiveFrom: [ this.datePipe.transform(this.project.config.archive_from, dateFormat) ] }); } Loading @@ -83,7 +84,7 @@ export class ProjectConfigComponent implements OnInit { this.projectService.updateProjectConfig(newValues).subscribe( () => { this.router.onSameUrlNavigation = 'reload'; this.router.navigate([ '.' ], { relativeTo: this.route }).then(() => { this.router.navigate([ '.' ], { relativeTo: this.route, preserveQueryParams: true }).then(() => { this.flashMessagesService.show('Configuration update successful.', { cssClass: 'alert-success' }); }); }, (error: any) => { Loading src/app/secrets/secret-detail/secret-detail.component.html 0 → 100644 +83 −0 Original line number Diff line number Diff line <div class="container"> <div class="page-header"> <h1>{{secret?.name}}</h1> <div class="row page-controls"> <div class="col-lg-4" *ngIf="loggedInUser?.is_admin"> <button data-toggle="modal" data-target="#delete_secret_modal" class="btn btn-danger pull-right"> Delete </button> </div> </div> </div> <div class="col-md-9 page-body"> <h3>{{secret?.name}}</h3> <form [formGroup]="formData"> <div class="form-group row"> <label for="name" class="col-lg-3 control-label">Name:</label> <div class="col-lg-8"> <input type="text" id="name" formControlName="name" class="form-control" required> </div> </div> <div class="form-group row"> <label for="created_at" class="col-lg-3 control-label">Created at:</label> <div class="col-lg-8"> <input [attr.disabled]="true" type="text" id="created_at" formControlName="created_at" class="form-control" required> </div> </div> <div class="form-group row"> <label for="expires_at" class="col-lg-3 control-label">Expires at:</label> <div class="col-lg-8"> <input id="expires_at" formControlName="expires_at" class="form-control"> </div> </div> <!--div class="form-group row"> <div class="col-md-3"> <button [attr.disabled]="formData?.status === 'VALID' ? null : true" class="btn btn-primary btn-signin" type="submit" (click)="updateProject()"> Update </button> </div> <div class="col-md-3"> <button class="btn btn-default" (click)="resetForm()">Revert</button> </div> </div--> </form> </div> </div> <div> <div id="delete_secret_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">Delete secret</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 delete secret: <strong>{{secret?.name}}</strong>? </p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal" (click)="deleteSecret()">Yes</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button> </div> </div> </div> </div> </div> src/app/secrets/secret-detail/secret-detail.component.scss 0 → 100644 +0 −0 Empty file added. src/app/secrets/secret-detail/secret-detail.component.spec.ts 0 → 100644 +25 −0 Original line number Diff line number Diff line import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SecretDetailComponent } from './secret-detail.component'; describe('SecretDetailComponent', () => { let component: SecretDetailComponent; let fixture: ComponentFixture<SecretDetailComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ SecretDetailComponent ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(SecretDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); }); Loading
src/app/core/core.module.ts +33 −29 Original line number Diff line number Diff line import {NgModule, Optional, SkipSelf} from '@angular/core'; import {CommonModule, DatePipe} from '@angular/common'; import {ReactiveFormsModule} from '@angular/forms'; import {HttpClientModule} from '@angular/common/http'; import {JwtModule} from '@auth0/angular-jwt'; import {RouterModule} from '@angular/router'; import { NgModule, Optional, SkipSelf } from '@angular/core'; import { CommonModule, DatePipe } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { JwtModule } from '@auth0/angular-jwt'; import { RouterModule } from '@angular/router'; import { FlashMessagesModule } from 'angular2-flash-messages'; import {AuthService} from '../services/auth.service'; import {UserService} from '../services/user.service'; import { AuthService } from '../services/auth.service'; import { UserService } from '../services/user.service'; import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; import {AuthModule} from '../auth/auth.module'; import {CoreRoutingModule} from './core-routing.module'; import {SharedModule} from '../shared/shared.module'; import {CourseService} from '../services/course.service'; import {BaseLayoutComponent} from './base-layout/base-layout.component'; import {DashboardComponent} from './dashboard/dashboard.component'; import {environment} from '../../environments/environment'; import {UnauthenticatedGuard} from '../guards/unauthenticated.guard'; import {AuthenticatedGuard} from '../guards/authenticated.guard'; import {GitlabLoginGuard} from '../guards/gitlab-login.guard'; import {AdminGuard} from '../guards/admin.guard'; import {AdminOrOwnGuard} from '../guards/admin-or-own.guard'; import {ProjectService} from '../services/project.service'; import {LoggedInUserResolver} from '../resolvers/logged-in-user-resolver.service'; import {PermissionsService} from '../services/permissions.service'; import {SubmissionService} from '../services/submission.service'; import {AngularMultiSelectModule} from 'angular2-multiselect-dropdown'; import {CourseQueryParamResolver} from '../resolvers/course-query-param-resolver.service'; import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolver.service'; import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; import { AuthModule } from '../auth/auth.module'; import { CoreRoutingModule } from './core-routing.module'; import { SharedModule } from '../shared/shared.module'; import { CourseService } from '../services/course.service'; import { BaseLayoutComponent } from './base-layout/base-layout.component'; import { DashboardComponent } from './dashboard/dashboard.component'; import { environment } from '../../environments/environment'; import { UnauthenticatedGuard } from '../guards/unauthenticated.guard'; import { AuthenticatedGuard } from '../guards/authenticated.guard'; import { GitlabLoginGuard } from '../guards/gitlab-login.guard'; import { AdminGuard } from '../guards/admin.guard'; import { AdminOrOwnGuard } from '../guards/admin-or-own.guard'; import { ProjectService } from '../services/project.service'; import { LoggedInUserResolver } from '../resolvers/logged-in-user-resolver.service'; import { PermissionsService } from '../services/permissions.service'; import { SubmissionService } from '../services/submission.service'; import { AngularMultiSelectModule } from 'angular2-multiselect-dropdown'; import { CourseQueryParamResolver } from '../resolvers/course-query-param-resolver.service'; import { ProjectQueryParamResolver } from '../resolvers/project-query-param-resolver.service'; import { WorkerService } from '../services/worker.service'; import { SecretsModule } from '../secrets/secrets.module'; @NgModule({ imports: [ Loading @@ -47,7 +49,8 @@ import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolv AuthModule, CoreRoutingModule, AngularMultiSelectModule, SharedModule SharedModule, SecretsModule ], declarations: [ PageNotFoundComponent, Loading @@ -57,6 +60,7 @@ import {ProjectQueryParamResolver} from '../resolvers/project-query-param-resolv providers: [ AuthService, UserService, WorkerService, CourseService, ProjectService, PermissionsService, Loading
src/app/courses/projects/project-config/project-config.component.ts +7 −6 Original line number Diff line number Diff line import { Component, Input, LOCALE_ID, OnInit } from '@angular/core'; import {Component, Input, OnInit} from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Project, ProjectConfig, User } from '../../../shared/models/models'; import { ProjectService } from '../../../services/project.service'; Loading Loading @@ -47,7 +47,8 @@ export class ProjectConfigComponent implements OnInit { } initFormValues() { const dateFormat = 'yyyy-MM-dd HH:mm'; // TODO: revamp date -> date, time, validate input this.configData.setValue({ testFilesSource: [ this.project.config.test_files_source ], fileWhitelist: [ this.project.config.file_whitelist ], Loading @@ -55,9 +56,9 @@ export class ProjectConfigComponent implements OnInit { postSubmitScript: [ this.project.config.post_submit_script ], submissionParameters: [ this.project.config.submission_parameters ], submissionSchedulerConfig: [ this.project.config.submission_scheduler_config ], submissionsAllowedFrom: [ this.datePipe.transform(this.project.config.submissions_allowed_from,) ], submissionsAllowedTo: [ this.datePipe.transform(this.project.config.submissions_allowed_to, 'yyyy-MM-ddTHH:mm') ], archiveFrom: [ this.datePipe.transform(this.project.config.archive_from, 'yyyy-MM-ddTHH:mm') ] submissionsAllowedFrom: [ this.datePipe.transform(this.project.config.submissions_allowed_from, dateFormat) ], submissionsAllowedTo: [ this.datePipe.transform(this.project.config.submissions_allowed_to, dateFormat) ], archiveFrom: [ this.datePipe.transform(this.project.config.archive_from, dateFormat) ] }); } Loading @@ -83,7 +84,7 @@ export class ProjectConfigComponent implements OnInit { this.projectService.updateProjectConfig(newValues).subscribe( () => { this.router.onSameUrlNavigation = 'reload'; this.router.navigate([ '.' ], { relativeTo: this.route }).then(() => { this.router.navigate([ '.' ], { relativeTo: this.route, preserveQueryParams: true }).then(() => { this.flashMessagesService.show('Configuration update successful.', { cssClass: 'alert-success' }); }); }, (error: any) => { Loading
src/app/secrets/secret-detail/secret-detail.component.html 0 → 100644 +83 −0 Original line number Diff line number Diff line <div class="container"> <div class="page-header"> <h1>{{secret?.name}}</h1> <div class="row page-controls"> <div class="col-lg-4" *ngIf="loggedInUser?.is_admin"> <button data-toggle="modal" data-target="#delete_secret_modal" class="btn btn-danger pull-right"> Delete </button> </div> </div> </div> <div class="col-md-9 page-body"> <h3>{{secret?.name}}</h3> <form [formGroup]="formData"> <div class="form-group row"> <label for="name" class="col-lg-3 control-label">Name:</label> <div class="col-lg-8"> <input type="text" id="name" formControlName="name" class="form-control" required> </div> </div> <div class="form-group row"> <label for="created_at" class="col-lg-3 control-label">Created at:</label> <div class="col-lg-8"> <input [attr.disabled]="true" type="text" id="created_at" formControlName="created_at" class="form-control" required> </div> </div> <div class="form-group row"> <label for="expires_at" class="col-lg-3 control-label">Expires at:</label> <div class="col-lg-8"> <input id="expires_at" formControlName="expires_at" class="form-control"> </div> </div> <!--div class="form-group row"> <div class="col-md-3"> <button [attr.disabled]="formData?.status === 'VALID' ? null : true" class="btn btn-primary btn-signin" type="submit" (click)="updateProject()"> Update </button> </div> <div class="col-md-3"> <button class="btn btn-default" (click)="resetForm()">Revert</button> </div> </div--> </form> </div> </div> <div> <div id="delete_secret_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">Delete secret</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 delete secret: <strong>{{secret?.name}}</strong>? </p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal" (click)="deleteSecret()">Yes</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button> </div> </div> </div> </div> </div>
src/app/secrets/secret-detail/secret-detail.component.spec.ts 0 → 100644 +25 −0 Original line number Diff line number Diff line import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SecretDetailComponent } from './secret-detail.component'; describe('SecretDetailComponent', () => { let component: SecretDetailComponent; let fixture: ComponentFixture<SecretDetailComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ SecretDetailComponent ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(SecretDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); });