| @@ -13,6 +13,7 @@ import { QuizComponent } from './tabs/courses/quiz/quiz.component'; | |||||
| import { PostDetailsComponent } from './reusable-components/forum/post-details/post-details.component'; | import { PostDetailsComponent } from './reusable-components/forum/post-details/post-details.component'; | ||||
| import { ChatPageComponent } from './chat-page/chat-page.component'; | import { ChatPageComponent } from './chat-page/chat-page.component'; | ||||
| import { SettingsComponent } from './settings/settings.component'; | import { SettingsComponent } from './settings/settings.component'; | ||||
| import { TestComponent } from './tabs/courses/test/test.component'; | |||||
| const routes: Routes = [ | const routes: Routes = [ | ||||
| { path: '', pathMatch: 'full', redirectTo: 'welcome' }, | { path: '', pathMatch: 'full', redirectTo: 'welcome' }, | ||||
| @@ -24,6 +25,7 @@ const routes: Routes = [ | |||||
| { component: VideoChapterComponent, path: 'video-chapter/:heading' }, | { component: VideoChapterComponent, path: 'video-chapter/:heading' }, | ||||
| { component: VideoNotesComponent, path: 'video-notes/:heading' }, | { component: VideoNotesComponent, path: 'video-notes/:heading' }, | ||||
| { component: QuizComponent, path: 'quiz' }, | { component: QuizComponent, path: 'quiz' }, | ||||
| { component: TestComponent, path: 'test'}, | |||||
| { component: CalendarComponent, path: 'calendar' }, | { component: CalendarComponent, path: 'calendar' }, | ||||
| { component: AttendanceComponent, path: 'attendance'}, | { component: AttendanceComponent, path: 'attendance'}, | ||||
| { component: ForumPageComponent, path: 'forum'}, | { component: ForumPageComponent, path: 'forum'}, | ||||
| @@ -8,6 +8,9 @@ import { NgxSiemaModule } from 'ngx-siema'; | |||||
| import { AppRoutingModule } from './app-routing.module'; | import { AppRoutingModule } from './app-routing.module'; | ||||
| import { FormsModule } from '@angular/forms'; | import { FormsModule } from '@angular/forms'; | ||||
| // Import services | |||||
| import { DemoService } from './services/demo.service'; | |||||
| // Component imports | // Component imports | ||||
| import { AppComponent } from './app.component'; | import { AppComponent } from './app.component'; | ||||
| import { WelcomeComponent } from './welcome/welcome.component'; | import { WelcomeComponent } from './welcome/welcome.component'; | ||||
| @@ -33,9 +36,11 @@ import { ChatPageComponent } from './chat-page/chat-page.component'; | |||||
| import { ChatWindowComponent } from './chat-page/chat-window/chat-window.component'; | import { ChatWindowComponent } from './chat-page/chat-window/chat-window.component'; | ||||
| import { SettingsComponent } from './settings/settings.component'; | import { SettingsComponent } from './settings/settings.component'; | ||||
| import { ClassCardListComponent } from './reusable-components/class-card-list/class-card-list.component'; | import { ClassCardListComponent } from './reusable-components/class-card-list/class-card-list.component'; | ||||
| // Import services | |||||
| import { DemoService } from './services/demo.service'; | |||||
| import { TestComponent } from './tabs/courses/test/test.component'; | |||||
| import { StartComponent } from './tabs/courses/test/start/start.component'; | |||||
| import { EndComponent } from './tabs/courses/test/end/end.component'; | |||||
| import { QuestionSheetComponent } from './tabs/courses/test/question-sheet/question-sheet.component'; | |||||
| import { QuestionComponent } from './tabs/courses/test/question-sheet/question/question.component'; | |||||
| @NgModule({ | @NgModule({ | ||||
| declarations: [ | declarations: [ | ||||
| @@ -61,6 +66,11 @@ import { DemoService } from './services/demo.service'; | |||||
| ChatWindowComponent, | ChatWindowComponent, | ||||
| SettingsComponent, | SettingsComponent, | ||||
| ClassCardListComponent, | ClassCardListComponent, | ||||
| TestComponent, | |||||
| StartComponent, | |||||
| EndComponent, | |||||
| QuestionSheetComponent, | |||||
| QuestionComponent, | |||||
| ], | ], | ||||
| imports: [ | imports: [ | ||||
| BrowserModule, | BrowserModule, | ||||
| @@ -31,7 +31,7 @@ | |||||
| <p> | <p> | ||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ab vel reiciendis. Repudiandae nobis pariatur laboriosam, natus quidem quos architecto provident similique officiis vero at cum excepturi eius, eligendi aperiam. | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem ab vel reiciendis. Repudiandae nobis pariatur laboriosam, natus quidem quos architecto provident similique officiis vero at cum excepturi eius, eligendi aperiam. | ||||
| </p> | </p> | ||||
| <button> Take the test now! </button> | |||||
| <button [routerLink]="'/test'"> Take the test now! </button> | |||||
| </section> | </section> | ||||
| </section> | </section> | ||||
| @@ -0,0 +1 @@ | |||||
| <p>end works!</p> | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { EndComponent } from './end.component'; | |||||
| describe('EndComponent', () => { | |||||
| let component: EndComponent; | |||||
| let fixture: ComponentFixture<EndComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ EndComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(EndComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,15 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| @Component({ | |||||
| selector: 'app-end', | |||||
| templateUrl: './end.component.html', | |||||
| styleUrls: ['./end.component.scss'] | |||||
| }) | |||||
| export class EndComponent implements OnInit { | |||||
| constructor() { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1 @@ | |||||
| <p>question-sheet works!</p> | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { QuestionSheetComponent } from './question-sheet.component'; | |||||
| describe('QuestionSheetComponent', () => { | |||||
| let component: QuestionSheetComponent; | |||||
| let fixture: ComponentFixture<QuestionSheetComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ QuestionSheetComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(QuestionSheetComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,15 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| @Component({ | |||||
| selector: 'app-question-sheet', | |||||
| templateUrl: './question-sheet.component.html', | |||||
| styleUrls: ['./question-sheet.component.scss'] | |||||
| }) | |||||
| export class QuestionSheetComponent implements OnInit { | |||||
| constructor() { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1 @@ | |||||
| <p>question works!</p> | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { QuestionComponent } from './question.component'; | |||||
| describe('QuestionComponent', () => { | |||||
| let component: QuestionComponent; | |||||
| let fixture: ComponentFixture<QuestionComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ QuestionComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(QuestionComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,15 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| @Component({ | |||||
| selector: 'app-question', | |||||
| templateUrl: './question.component.html', | |||||
| styleUrls: ['./question.component.scss'] | |||||
| }) | |||||
| export class QuestionComponent implements OnInit { | |||||
| constructor() { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,80 @@ | |||||
| <section class="page-container"> | |||||
| <header class="nav-header"> | |||||
| <button class="close-button" (click)="back()"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </button> | |||||
| </header> | |||||
| <div class="container"> | |||||
| <section class="subject-details"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/beaker.svg"></svg-icon> | |||||
| <h2> CHEMISTRY </h2> | |||||
| <h4> PREPERATORY EXAM </h4> | |||||
| <p> Total Marks: 100 </p> | |||||
| <div class="timer"> | |||||
| <p> Exam Start in: </p> | |||||
| <div class="count"> 00:00:0{{ secondsCounter }} </div> | |||||
| </div> | |||||
| <button class="start-button" *ngIf="secondsCounter === 0" | |||||
| (click)="startTest()"> | |||||
| START | |||||
| </button> | |||||
| </section> | |||||
| </div> | |||||
| <button class="rules-button" (click)="showRules = true"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/information.svg"></svg-icon> | |||||
| Examination Rules & Technologies | |||||
| </button> | |||||
| <section class="rules" [ngClass]="{'active' : showRules }"> | |||||
| <header> | |||||
| <h5> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/information.svg"></svg-icon> | |||||
| Information | |||||
| </h5> | |||||
| <button (click)="showRules = false"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </button> | |||||
| </header> | |||||
| <h2> Exam Rules & Technologies </h2> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat voluptate eligendi provident nulla reiciendis. Corporis nihil at incidunt voluptas repellat aliquam beatae minima nam voluptatum, quaerat, ullam dolor sunt repudiandae. | |||||
| </p> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eius, laboriosam sapiente, ab optio, unde a suscipit expedita consequuntur modi repellendus eligendi obcaecati explicabo repellat voluptatem nihil earum! Quisquam asperiores, nemo! | |||||
| </p> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestias architecto nostrum culpa aliquam vitae pariatur porro voluptatibus quisquam exercitationem sit voluptate tempore atque, natus quod rem voluptatem esse? Nostrum, voluptatibus. | |||||
| </p> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente commodi labore saepe, temporibus cum deserunt voluptate minima dolorem doloremque dolores, libero vel voluptates expedita tempore quos incidunt recusandae dolor explicabo. | |||||
| </p> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia excepturi, corporis voluptatum illum autem dolore consequuntur cupiditate itaque facilis doloremque, ipsum voluptas perspiciatis quas eius commodi minima labore, omnis natus. | |||||
| </p> | |||||
| <h2> List of item to use </h2> | |||||
| <ol> | |||||
| <li> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nostrum mollitia harum nisi repellendus possimus fugiat dolores debitis voluptatum. Ullam doloremque nemo porro numquam! Adipisci incidunt vitae consequatur sapiente eius cum. | |||||
| </li> | |||||
| <li> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vero voluptatem magnam quidem, autem, dolorem pariatur? Rem libero doloremque ipsa, earum. Tempore aut ex voluptatem accusamus maxime, laudantium, atque harum blanditiis. | |||||
| </li> | |||||
| <li> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa consequatur, eveniet. Expedita, reprehenderit! Exercitationem repudiandae sapiente laboriosam laudantium doloribus velit totam dolorem eos dolores optio, labore blanditiis eveniet, sint maiores! | |||||
| </li> | |||||
| </ol> | |||||
| <p> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nostrum delectus, voluptatibus facilis magnam, cum veritatis quis reiciendis unde, porro nihil sed! Quibusdam maxime voluptatum consequuntur neque ipsa incidunt, eos, quidem. | |||||
| </p> | |||||
| </section> | |||||
| </section> | |||||
| @@ -0,0 +1,174 @@ | |||||
| .page-container { | |||||
| padding-bottom: 0; | |||||
| position: relative; | |||||
| } | |||||
| .nav-header { | |||||
| background-color: var(--black); | |||||
| } | |||||
| .rules-button { | |||||
| background-color: var(--ash-black); | |||||
| border: 0px; | |||||
| width: 100%; | |||||
| height: 40px; | |||||
| color: var(--teal-green); | |||||
| font-size: 14px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| .icon { | |||||
| width: 14px; | |||||
| height: 14px; | |||||
| fill: var(--teal-green); | |||||
| margin-right: 5px; | |||||
| } | |||||
| } | |||||
| .container { | |||||
| height: calc(100vh - 40px - 60px); | |||||
| width: 100%; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| } | |||||
| .subject-details { | |||||
| text-align: center; | |||||
| .icon { | |||||
| width: 60px; | |||||
| height: 60px; | |||||
| display: block; | |||||
| margin: 0 auto; | |||||
| } | |||||
| h2 { | |||||
| font-size: 26px; | |||||
| color: white; | |||||
| font-weight: 500; | |||||
| margin: 10px auto; | |||||
| } | |||||
| h4 { | |||||
| font-size: 18px; | |||||
| color: var(--teal-green); | |||||
| font-weight: 500; | |||||
| margin: 10px auto; | |||||
| } | |||||
| p { | |||||
| margin: 10px auto; | |||||
| font-size: 16px; | |||||
| color: var(--light-grey); | |||||
| } | |||||
| .timer { | |||||
| margin: 60px auto 10px; | |||||
| p { | |||||
| margin: 0; | |||||
| } | |||||
| .count { | |||||
| font-size: 30px; | |||||
| font-weight: 500; | |||||
| color: var(--green); | |||||
| } | |||||
| } | |||||
| .start-button { | |||||
| font-size: 18px; | |||||
| height: 45px; | |||||
| border-radius: 30px; | |||||
| background-color: var(--teal-green); | |||||
| border: 0px; | |||||
| color: white; | |||||
| width: 150px; | |||||
| display: block; | |||||
| margin: 20px auto 0; | |||||
| } | |||||
| } | |||||
| .rules { | |||||
| position: fixed; | |||||
| left: 0; | |||||
| bottom: 0; | |||||
| z-index: 1; | |||||
| max-height: calc(100vh - 100px); | |||||
| width: 100%; | |||||
| background-color: white; | |||||
| border-top-left-radius: 30px; | |||||
| border-top-right-radius: 30px; | |||||
| padding: 0px 7% 30px; | |||||
| overflow: auto; | |||||
| transform: translateY(100vh); | |||||
| transition: transform 0.5s; | |||||
| &.active { | |||||
| transform: translateY(0); | |||||
| } | |||||
| header { | |||||
| display: flex; | |||||
| width: 100%; | |||||
| justify-content: space-between; | |||||
| position: sticky; | |||||
| position: -webkit-sticky; | |||||
| z-index: 1; | |||||
| top: 0; | |||||
| background-color: white; | |||||
| padding: 30px 0 10px; | |||||
| } | |||||
| h5 { | |||||
| font-size: 16px; | |||||
| font-weight: 400; | |||||
| color: var(--dark-grey); | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| .icon { | |||||
| width: 15px; | |||||
| height: 15px; | |||||
| margin-right: 5px; | |||||
| margin-top: -5px; | |||||
| fill: var(--dark-grey); | |||||
| } | |||||
| } | |||||
| button { | |||||
| width: 30px; | |||||
| height: 30px; | |||||
| background-color: var(--light-grey); | |||||
| border: 0px; | |||||
| color: white; | |||||
| border-radius: 50%; | |||||
| .icon { | |||||
| width: 12px; | |||||
| height: 12px; | |||||
| fill: white; | |||||
| } | |||||
| } | |||||
| h2 { | |||||
| font-size: 18px; | |||||
| color: var(--ash-black); | |||||
| margin-bottom: 10px; | |||||
| } | |||||
| p, li { | |||||
| margin-bottom: 20px; | |||||
| font-size: 16px; | |||||
| color: var(--black); | |||||
| line-height: 1.5; | |||||
| } | |||||
| ol { | |||||
| margin-left: 30px; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { StartComponent } from './start.component'; | |||||
| describe('StartComponent', () => { | |||||
| let component: StartComponent; | |||||
| let fixture: ComponentFixture<StartComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ StartComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(StartComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,37 @@ | |||||
| import { Component, OnInit, Output, EventEmitter} from '@angular/core'; | |||||
| import { Location } from '@angular/common'; | |||||
| @Component({ | |||||
| selector: 'app-start', | |||||
| templateUrl: './start.component.html', | |||||
| styleUrls: ['./start.component.scss'] | |||||
| }) | |||||
| export class StartComponent implements OnInit { | |||||
| secondsCounter: number = 3; | |||||
| timerInterval: any; | |||||
| showRules: boolean = false; | |||||
| @Output() startPageEvent = new EventEmitter(); | |||||
| constructor( | |||||
| private location: Location | |||||
| ) { } | |||||
| ngOnInit(): void { | |||||
| this.timerInterval = setInterval(() => { | |||||
| if (this.secondsCounter > 0) { | |||||
| this.secondsCounter -= 1; | |||||
| } else { | |||||
| clearInterval(this.timerInterval); | |||||
| } | |||||
| }, 1000); | |||||
| } | |||||
| back() { | |||||
| this.location.back(); | |||||
| } | |||||
| startTest() { | |||||
| this.startPageEvent.emit('start-test'); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,3 @@ | |||||
| <section class="page-container full-bg" color="black"> | |||||
| <app-start *ngIf="testStatus === 'START'" (startPageEvent)="getStartPageEvents($event)"></app-start> | |||||
| </section> | |||||
| @@ -0,0 +1,3 @@ | |||||
| .page-container { | |||||
| padding-bottom: 0; | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { TestComponent } from './test.component'; | |||||
| describe('TestComponent', () => { | |||||
| let component: TestComponent; | |||||
| let fixture: ComponentFixture<TestComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ TestComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(TestComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,22 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| @Component({ | |||||
| selector: 'app-test', | |||||
| templateUrl: './test.component.html', | |||||
| styleUrls: ['./test.component.scss'] | |||||
| }) | |||||
| export class TestComponent implements OnInit { | |||||
| testStatus: string = 'START'; | |||||
| constructor() { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| getStartPageEvents(e: string) { | |||||
| if (e === 'start-test') { | |||||
| this.testStatus = 'PROGRESS'; | |||||
| } | |||||
| } | |||||
| } | |||||