| @@ -9,6 +9,7 @@ import { CalendarComponent } from './calendar/calendar.component'; | |||||
| import { AttendanceComponent } from './tabs/more/attendance/attendance.component'; | import { AttendanceComponent } from './tabs/more/attendance/attendance.component'; | ||||
| import { ForumPageComponent } from './tabs/more/forum-page/forum-page.component'; | import { ForumPageComponent } from './tabs/more/forum-page/forum-page.component'; | ||||
| import { ChapterNotesComponent } from './tabs/courses/chapter-notes/chapter-notes.component'; | import { ChapterNotesComponent } from './tabs/courses/chapter-notes/chapter-notes.component'; | ||||
| import { QuizComponent } from './tabs/courses/quiz/quiz.component'; | |||||
| const routes: Routes = [ | const routes: Routes = [ | ||||
| { path: '', pathMatch: 'full', redirectTo: 'welcome' }, | { path: '', pathMatch: 'full', redirectTo: 'welcome' }, | ||||
| @@ -19,6 +20,7 @@ const routes: Routes = [ | |||||
| { component: ChapterNotesComponent, path: 'chapter-notes/:heading' }, | { component: ChapterNotesComponent, path: 'chapter-notes/:heading' }, | ||||
| { 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: CalendarComponent, path: 'calendar' }, | { component: CalendarComponent, path: 'calendar' }, | ||||
| { component: AttendanceComponent, path: 'attendance'}, | { component: AttendanceComponent, path: 'attendance'}, | ||||
| { component: ForumPageComponent, path: 'forum'}, | { component: ForumPageComponent, path: 'forum'}, | ||||
| @@ -24,6 +24,7 @@ import { ConfirmationPopupComponent } from './reusable-components/confirmation-p | |||||
| import { VideoNotesComponent } from './tabs/courses/video-chapter/video-notes/video-notes.component'; | import { VideoNotesComponent } from './tabs/courses/video-chapter/video-notes/video-notes.component'; | ||||
| import { ChapterNotesComponent } from './tabs/courses/chapter-notes/chapter-notes.component'; | import { ChapterNotesComponent } from './tabs/courses/chapter-notes/chapter-notes.component'; | ||||
| import { CourseDetailsComponent } from './tabs/courses/course-details/course-details.component'; | import { CourseDetailsComponent } from './tabs/courses/course-details/course-details.component'; | ||||
| import { QuizComponent } from './tabs/courses/quiz/quiz.component'; | |||||
| @NgModule({ | @NgModule({ | ||||
| declarations: [ | declarations: [ | ||||
| @@ -43,6 +44,7 @@ import { CourseDetailsComponent } from './tabs/courses/course-details/course-det | |||||
| VideoNotesComponent, | VideoNotesComponent, | ||||
| ChapterNotesComponent, | ChapterNotesComponent, | ||||
| CourseDetailsComponent, | CourseDetailsComponent, | ||||
| QuizComponent, | |||||
| ], | ], | ||||
| imports: [ | imports: [ | ||||
| BrowserModule, | BrowserModule, | ||||
| @@ -32,7 +32,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]="['/quiz']"> Take the test now! </button> | |||||
| </section> | </section> | ||||
| </section> | </section> | ||||
| @@ -0,0 +1,164 @@ | |||||
| <div class="page"> | |||||
| <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> | |||||
| <h5> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/question-mark.svg"></svg-icon> | |||||
| <span> Quiz </span> | |||||
| </h5> | |||||
| </header> | |||||
| <section class="question-status"> | |||||
| <div class="question-number correct"> | |||||
| <span> | |||||
| <label> 1 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number wrong"> | |||||
| <span> | |||||
| <label> 2 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number correct"> | |||||
| <span> | |||||
| <label> 3 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number wrong"> | |||||
| <span> | |||||
| <label> 4 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number correct"> | |||||
| <span> | |||||
| <label> 5 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number wrong"> | |||||
| <span> | |||||
| <label> 6 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number current"> | |||||
| <span> | |||||
| <label> 7 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number"> | |||||
| <span> | |||||
| <label> 8 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number"> | |||||
| <span> | |||||
| <label> 9 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| <div class="question-number"> | |||||
| <span> | |||||
| <label> 10 </label> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </span> | |||||
| </div> | |||||
| </section> | |||||
| <ngx-siema [options]="options"> | |||||
| <ngx-siema-slide> | |||||
| <p class="question"> | |||||
| Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto obcaecati perferendis suscipit consequuntur labore voluptatibus vitae totam minima, tempore excepturi, cum at qui voluptas rerum nostrum odio minus, voluptatem dolores. ? | |||||
| </p> | |||||
| <div class="timer-holder"> | |||||
| <div class="timer"> | |||||
| <span> 00:60 </span> | |||||
| <svg width="55" height="55" viewBox="0 0 55 55"> | |||||
| <circle cx="27.5" cy="27.5" r="21.5" fill="none" stroke="#cecece" stroke-width="3" /> | |||||
| <circle cx="27.5" cy="27.5" r="21.5" fill="none" stroke-width="3" | |||||
| stroke-dasharray="135.2" stroke-dashoffset="52.08" id="progress" /> | |||||
| </svg> | |||||
| </div> | |||||
| </div> | |||||
| <!-- 135.2 * (1 - 0.6) --> | |||||
| <ol class="option-list"> | |||||
| <li class="wrong"> | |||||
| <label> 1. Option 1 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| <li> | |||||
| <label> 2. Option 2 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| <li> | |||||
| <label> 3. Option 3 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| <li class="correct"> | |||||
| <label> 4. Option 4 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| </ol> | |||||
| </ngx-siema-slide> | |||||
| <ngx-siema-slide> | |||||
| <p class="question"> | |||||
| dis suscipit consequuntur labore voluptatibus vitae totam minima, tempore excepturi, cum at qui voluptas rerum nostrum odio minus, voluptatem dolores. ? | |||||
| </p> | |||||
| <div class="timer-holder"> | |||||
| <div class="timer"> | |||||
| <span> 00:40 </span> | |||||
| <svg width="55" height="55" viewBox="0 0 55 55"> | |||||
| <circle cx="27.5" cy="27.5" r="21.5" fill="none" stroke="#cecece" stroke-width="3" /> | |||||
| <circle cx="27.5" cy="27.5" r="21.5" fill="none" stroke-width="3" | |||||
| stroke-dasharray="135.2" stroke-dashoffset="52.08" id="progress" /> | |||||
| </svg> | |||||
| </div> | |||||
| </div> | |||||
| <!-- 135.2 * (1 - 0.6) --> | |||||
| <ol class="option-list"> | |||||
| <li class="wrong"> | |||||
| <label> 1. Option 1 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| <li> | |||||
| <label> 2. Option 2 </label> | |||||
| <div class="icon-holder"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/checkmark.svg"></svg-icon> | |||||
| </div> | |||||
| </li> | |||||
| </ol> | |||||
| </ngx-siema-slide> | |||||
| </ngx-siema> | |||||
| <button class="next-button" (click)="next()"> Next </button> | |||||
| </div> | |||||
| @@ -0,0 +1,281 @@ | |||||
| .page { | |||||
| background-color: var(--black); | |||||
| height: 100vh; | |||||
| overflow: auto; | |||||
| } | |||||
| .nav-header { | |||||
| background-color: var(--ash-black); | |||||
| display: flex; | |||||
| align-items: center; | |||||
| padding: 0 5%; | |||||
| height: 60px; | |||||
| position: sticky; | |||||
| position: -webkit-sticky; | |||||
| top: 0; | |||||
| z-index: 1; | |||||
| box-shadow: 0px 0px 5px var(--black); | |||||
| .close-button { | |||||
| border: 0px; | |||||
| background-color: transparent; | |||||
| .icon { | |||||
| width: 16px; | |||||
| height: 16px; | |||||
| fill: var(--light-grey); | |||||
| } | |||||
| } | |||||
| h5 { | |||||
| font-size: 16px; | |||||
| color: white; | |||||
| font-weight: 400; | |||||
| margin-left: 20px; | |||||
| letter-spacing: 1px; | |||||
| .icon { | |||||
| width: 15px; | |||||
| height: 15px; | |||||
| fill: white; | |||||
| margin-right: 3px; | |||||
| vertical-align: middle; | |||||
| position: relative; | |||||
| top: -1px; | |||||
| } | |||||
| } | |||||
| } | |||||
| .question-status { | |||||
| background-color: var(--ash-black); | |||||
| padding: 10px 5% 5px; | |||||
| display: inline-block; | |||||
| white-space: nowrap; | |||||
| width: 100%; | |||||
| overflow: auto; | |||||
| margin-bottom: -10px; | |||||
| .question-number { | |||||
| width: 20px; | |||||
| height: 20px; | |||||
| background-color: var(--dark-grey); | |||||
| color: white; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| display: inline-block; | |||||
| margin-right: 15px; | |||||
| border-radius: 50%; | |||||
| overflow: hidden; | |||||
| border: 1px solid var(--dark-grey); | |||||
| box-sizing: content-box; | |||||
| span { | |||||
| display: flex; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| } | |||||
| label { | |||||
| font-size: 10px; | |||||
| } | |||||
| .icon { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| fill: white; | |||||
| display: none; | |||||
| } | |||||
| &.correct { | |||||
| border-color: var(--green); | |||||
| background-color: white; | |||||
| label { | |||||
| display: none; | |||||
| } | |||||
| .icon { | |||||
| fill: var(--green); | |||||
| display: block; | |||||
| } | |||||
| } | |||||
| &.wrong { | |||||
| border-color: var(--danger-dark); | |||||
| background-color: var(--danger-dark); | |||||
| label { | |||||
| display: none; | |||||
| } | |||||
| .icon { | |||||
| fill: white; | |||||
| width: 10px; | |||||
| height: 10px; | |||||
| display: block; | |||||
| } | |||||
| } | |||||
| &.current { | |||||
| border-color: var(--light-grey); | |||||
| } | |||||
| } | |||||
| } | |||||
| ngx-siema-slide { | |||||
| display: block; | |||||
| .question { | |||||
| line-height: 1.6; | |||||
| color: white; | |||||
| font-size: 14px; | |||||
| background-color: var(--ash-black); | |||||
| padding: 15px 5%; | |||||
| } | |||||
| .timer-holder { | |||||
| background-color: var(--black); | |||||
| height: 70px; | |||||
| display: flex; | |||||
| align-items: flex-end; | |||||
| justify-content: center; | |||||
| overflow: hidden; | |||||
| position: relative; | |||||
| &::before { | |||||
| content: ''; | |||||
| width: 200vw; | |||||
| height: 100vw; | |||||
| border-radius: 50%; | |||||
| position: absolute; | |||||
| bottom: 25px; | |||||
| background-color: var(--ash-black); | |||||
| } | |||||
| .timer { | |||||
| width: 60px; | |||||
| height: 60px; | |||||
| border-radius: 50%; | |||||
| background-color: white; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| font-size: 12px; | |||||
| font-weight: 600; | |||||
| position: relative; | |||||
| color: var(--ash-black); | |||||
| svg { | |||||
| position: absolute; | |||||
| left: 0; | |||||
| top: 0; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| transform: rotate(-90deg); | |||||
| #progress { | |||||
| stroke: var(--green); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| .option-list { | |||||
| width: 90%; | |||||
| margin: 20px auto; | |||||
| list-style: none; | |||||
| li { | |||||
| display: flex; | |||||
| width: 100%; | |||||
| border: 1px solid var(--light-grey); | |||||
| color: white; | |||||
| border-radius: 15px; | |||||
| align-items: center; | |||||
| min-height: 50px; | |||||
| margin: 20px auto; | |||||
| justify-content: space-between; | |||||
| padding: 0 15px; | |||||
| label { | |||||
| font-size: 14px; | |||||
| } | |||||
| .icon-holder { | |||||
| width: 23px; | |||||
| height: 23px; | |||||
| border: 1px solid var(--light-grey); | |||||
| border-radius: 50%; | |||||
| overflow: hidden; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| .icon { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| fill: white; | |||||
| display: none; | |||||
| } | |||||
| } | |||||
| &.correct { | |||||
| box-shadow: 0px 0px 5px var(--green); | |||||
| border-color: var(--green); | |||||
| label { | |||||
| color: var(--green); | |||||
| } | |||||
| .icon-holder { | |||||
| border-color: var(--green); | |||||
| background-color: white; | |||||
| .icon { | |||||
| fill: var(--green); | |||||
| display: block; | |||||
| } | |||||
| } | |||||
| } | |||||
| &.wrong { | |||||
| box-shadow: 0px 0px 5px var(--danger-dark); | |||||
| border-color: var(--danger-dark); | |||||
| label { | |||||
| color: var(--danger-dark); | |||||
| } | |||||
| .icon-holder { | |||||
| border-color: var(--danger-dark); | |||||
| background-color: var(--danger-dark); | |||||
| .icon { | |||||
| fill: white; | |||||
| width: 10px; | |||||
| height: 10px; | |||||
| display: block; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| .next-button { | |||||
| width: 100px; | |||||
| height: 50px; | |||||
| border-radius: 30px; | |||||
| background-color: var(--teal-green); | |||||
| color: white; | |||||
| font-size: 14px; | |||||
| border: 0px; | |||||
| display: block; | |||||
| position: sticky; | |||||
| position: -webkit-sticky; | |||||
| bottom: 20px; | |||||
| margin: 10px auto 40px; | |||||
| box-shadow: 0px 0px 10px var(--teal-green); | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { QuizComponent } from './quiz.component'; | |||||
| describe('QuizComponent', () => { | |||||
| let component: QuizComponent; | |||||
| let fixture: ComponentFixture<QuizComponent>; | |||||
| beforeEach(async(() => { | |||||
| TestBed.configureTestingModule({ | |||||
| declarations: [ QuizComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| })); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(QuizComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,44 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| import { Location } from '@angular/common'; | |||||
| import { NgxSiemaOptions, NgxSiemaService } from 'ngx-siema'; | |||||
| @Component({ | |||||
| selector: 'app-quiz', | |||||
| templateUrl: './quiz.component.html', | |||||
| styleUrls: ['./quiz.component.scss'] | |||||
| }) | |||||
| export class QuizComponent implements OnInit { | |||||
| options: NgxSiemaOptions = { | |||||
| selector: '.siema', | |||||
| duration: 300, | |||||
| easing: 'ease-out', | |||||
| perPage: 1, | |||||
| startIndex: 0, | |||||
| draggable: false, | |||||
| threshold: 20, | |||||
| loop: false, | |||||
| onInit: () => { | |||||
| // runs immediately after first initialization | |||||
| }, | |||||
| onChange: () => { | |||||
| // runs after slide change | |||||
| }, | |||||
| }; | |||||
| constructor( | |||||
| private location: Location, | |||||
| private ngxSiemaService: NgxSiemaService | |||||
| ) { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| next() { | |||||
| this.ngxSiemaService.next(1); | |||||
| } | |||||
| back() { | |||||
| this.location.back(); | |||||
| } | |||||
| } | |||||
| @@ -45,7 +45,7 @@ export class VideoNotesComponent implements OnInit { | |||||
| } | } | ||||
| next() { | next() { | ||||
| this.ngxSiemaService.next(1).subscribe((data: any) => console.log(data)); | |||||
| this.ngxSiemaService.next(1); | |||||
| } | } | ||||
| ngOnDestroy() { | ngOnDestroy() { | ||||
| @@ -19,6 +19,7 @@ | |||||
| --green: #8cc63f; | --green: #8cc63f; | ||||
| --teal-green: #08c17e; | --teal-green: #08c17e; | ||||
| --danger: #ea8b8b; | --danger: #ea8b8b; | ||||
| --danger-dark: #d65f5f; | |||||
| } | } | ||||
| .confirmation-popup { | .confirmation-popup { | ||||