ソースを参照

Video Chapter UI

master
kj1352 5年前
コミット
1b472e5249
7個のファイルの変更384行の追加6行の削除
  1. +3
    -1
      src/app/app-routing.module.ts
  2. +2
    -0
      src/app/app.module.ts
  3. +5
    -5
      src/app/tabs/courses/details/details.component.html
  4. +99
    -0
      src/app/tabs/courses/video-chapter/video-chapter.component.html
  5. +215
    -0
      src/app/tabs/courses/video-chapter/video-chapter.component.scss
  6. +25
    -0
      src/app/tabs/courses/video-chapter/video-chapter.component.spec.ts
  7. +35
    -0
      src/app/tabs/courses/video-chapter/video-chapter.component.ts

+ 3
- 1
src/app/app-routing.module.ts ファイルの表示

@@ -3,6 +3,7 @@ import { Routes, RouterModule } from '@angular/router';
import { WelcomeComponent } from './welcome/welcome.component';
import { TabsComponent } from './tabs/tabs.component';
import { DetailsComponent } from './tabs/courses/details/details.component';
import { VideoChapterComponent } from './tabs/courses/video-chapter/video-chapter.component';

const routes: Routes = [
{ path: '', pathMatch: 'full', redirectTo: 'welcome' },
@@ -10,7 +11,8 @@ const routes: Routes = [
{ component: TabsComponent, path: 'tabs' },
{ component: TabsComponent, path: 'tabs/:subpage' },
{ component: DetailsComponent, path: 'course-details' },
{ component: DetailsComponent, path: 'course-details/:heading' }
{ component: DetailsComponent, path: 'course-details/:heading' },
{ component: VideoChapterComponent, path: 'video-chapter/:heading' }
];

@NgModule({


+ 2
- 0
src/app/app.module.ts ファイルの表示

@@ -12,6 +12,7 @@ import { CoursesComponent } from './tabs/courses/courses.component';
import { ReportsComponent } from './tabs/reports/reports.component';
import { MoreComponent } from './tabs/more/more.component';
import { DetailsComponent } from './tabs/courses/details/details.component';
import { VideoChapterComponent } from './tabs/courses/video-chapter/video-chapter.component';

@NgModule({
declarations: [
@@ -23,6 +24,7 @@ import { DetailsComponent } from './tabs/courses/details/details.component';
ReportsComponent,
MoreComponent,
DetailsComponent,
VideoChapterComponent,
],
imports: [
BrowserModule,


+ 5
- 5
src/app/tabs/courses/details/details.component.html ファイルの表示

@@ -53,7 +53,7 @@
<svg-icon [applyClass]="true" class="icon arrow" src="assets/custom-icons/down-arrow.svg"></svg-icon>
</div>
<ul class="topic-list">
<li class="topic completed">
<li class="topic completed" [routerLink]="['/video-chapter/', 'Topic-1']">
<svg-icon [applyClass]="true" class="icon checkmark" src="assets/custom-icons/checkmark.svg"></svg-icon>
<div class="topic-container">
<p>
@@ -63,7 +63,7 @@
</div>
</li>

<li class="topic completed">
<li class="topic completed" [routerLink]="['/video-chapter/', 'Topic-2']">
<svg-icon [applyClass]="true" class="icon checkmark" src="assets/custom-icons/checkmark.svg"></svg-icon>
<div class="topic-container">
<p>
@@ -73,7 +73,7 @@
</div>
</li>

<li class="topic">
<li class="topic" [routerLink]="['/video-chapter/', 'Topic-3']">
<svg-icon [applyClass]="true" class="icon checkmark" src="assets/custom-icons/checkmark.svg"></svg-icon>
<div class="topic-container">
<p>
@@ -83,7 +83,7 @@
</div>
</li>

<li class="topic">
<li class="topic" [routerLink]="['/video-chapter/', 'Topic-4']">
<svg-icon [applyClass]="true" class="icon checkmark" src="assets/custom-icons/checkmark.svg"></svg-icon>
<div class="topic-container">
<p>
@@ -93,7 +93,7 @@
</div>
</li>

<li class="topic">
<li class="topic" [routerLink]="['/video-chapter/', 'Topic-5']">
<svg-icon [applyClass]="true" class="icon checkmark" src="assets/custom-icons/checkmark.svg"></svg-icon>
<div class="topic-container">
<p>


+ 99
- 0
src/app/tabs/courses/video-chapter/video-chapter.component.html ファイルの表示

@@ -0,0 +1,99 @@
<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/play-button.svg"></svg-icon>
<span> {{ heading }} </span>
</h5>
</header>

<section class="video-player">
<button class="play-button">
<svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/play-button.svg"></svg-icon>
</button>
</section>

<section class="segments">
<button (click)="selectedSegment='transcript'"
[ngClass]="{'active': selectedSegment === 'transcript' }"> Transcript </button>
<button (click)="selectedSegment='attachments'"
[ngClass]="{'active': selectedSegment === 'attachments' }"> Attachments (2) </button>
<button (click)="selectedSegment='notes'"
[ngClass]="{'active': selectedSegment === 'notes' }"> Notes (2) </button>
</section>

<section class="segment-details">
<section *ngIf="selectedSegment === 'transcript'" class="transcript">
<p>
<span class="highlight"> Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span> Quis voluptates sint illum dolorem. Non beatae, illum repellendus maxime sunt nulla at inventore odit, voluptate laudantium doloribus. Atque vitae, veritatis aperiam.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita dolores ea facere quae temporibus. Beatae modi voluptates, dolorem, eveniet sed non a quaerat aperiam officiis voluptatibus nemo! Similique, tempora aspernatur.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Hic nihil molestias perspiciatis reprehenderit, ad adipisci quas nam, minima id vitae dolore impedit iste mollitia quibusdam alias commodi quam qui voluptatibus.
</p>
</section>

<ul class="attachment-list" *ngIf="selectedSegment === 'attachments'">
<li>
<div class="content">
<label> Attachment 1 </label>
<p>
quidem minima dolor delectus optio, dicta.
</p>
</div>
<svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/delete.svg"></svg-icon>
</li>

<li>
<div class="content">
<label> Attachment 2 </label>
<p>
quidem minima dolor delectus optio, dicta.
</p>
</div>
<svg-icon [applyClass]="true" class="icon download" src="assets/custom-icons/download.svg"></svg-icon>
</li>
</ul>

<ul class="notes-list" *ngIf="selectedSegment === 'notes'">
<li>
<div class="content">
<label> Notes 1 </label>
<p>
quidem minima dolor delectus optio, dicta.
</p>
</div>
<svg-icon [applyClass]="true" class="icon arrow" src="assets/custom-icons/down-arrow.svg"></svg-icon>
</li>

<li>
<div class="content">
<label> Notes 2 </label>
<p>
quidem minima dolor delectus optio, dicta.
</p>
</div>
<svg-icon [applyClass]="true" class="icon arrow" src="assets/custom-icons/down-arrow.svg"></svg-icon>
</li>

<li>
<div class="content">
<label> Notes 2 </label>
<p>
quidem minima dolor delectus optio, dicta.
</p>
</div>
<svg-icon [applyClass]="true" class="icon arrow" src="assets/custom-icons/down-arrow.svg"></svg-icon>
</li>

<button class="add-notes-button">
<svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/add.svg"></svg-icon>
<span> SAVE A NOTE </span>
</button>
</ul>
</section>
</div>

+ 215
- 0
src/app/tabs/courses/video-chapter/video-chapter.component.scss ファイルの表示

@@ -0,0 +1,215 @@
.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;

.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;
}
}
}

.video-player {
background-color: var(--dark-grey);
color: white;
display: flex;
align-items: center;
justify-content: center;
height: 40vh;
width: 100%;

.play-button {
background-color: transparent;
border: 0px;
}

.icon {
width: 50px;
height: 50px;
fill: white;
}
}

.segments {
display: flex;
align-items: stretch;
height: 40px;
border-radius: 7px;
overflow: hidden;
width: 90%;
margin: 20px auto;
background-color: var(--dark-grey);

button {
flex-grow: 1;
border-radius: 7px;
background-color: transparent;
color: white;
font-size: 13px;
border: 0px;

&.active {
background-color: white;
color: var(--teal);
font-weight: 500;
}
}
}

.segment-details {
padding: 0 6%;
}

.transcript {
color: var(--light-grey);

p {
font-size: 17px;
line-height: 2;
margin-bottom: 20px;

.highlight {
color: white;
}
}
}

.attachment-list {
list-style: none;

li {
padding: 15px;
background-color: var(--ash-black);
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 10px;
overflow: hidden;
margin-bottom: 15px;
}

.content {
width: calc(100% - 50px);
}

label {
color: white;
font-size: 15px;
display: block;
}

p {
color: var(--light-grey);
font-size: 12px;
}

.icon {
width: 20px;
height: 20px;
fill: var(--light-grey);

&.download {
fill: var(--teal-green);
}
}
}


.notes-list {
list-style: none;
padding-bottom: 60px;

li {
padding: 15px;
background-color: var(--ash-black);
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 10px;
overflow: hidden;
margin-bottom: 15px;
}

.content {
width: calc(100% - 50px);
}

label {
color: white;
font-size: 15px;
display: block;
}

p {
color: var(--light-grey);
font-size: 12px;
}

.icon {
width: 20px;
height: 20px;
fill: var(--light-grey);

&.arrow {
transform: rotate(-45deg);
}
}

.add-notes-button {
position: fixed;
left: 0px;
bottom: 0px;
background-color: var(--ash-black);
color: var(--light-grey);
font-size: 14px;
width: 100%;
height: 50px;
border: 0px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 0px 5px var(--black);

.icon {
width: 20px;
height: 20px;
fill: var(--light-grey);
margin-right: 5px;
}
}
}

+ 25
- 0
src/app/tabs/courses/video-chapter/video-chapter.component.spec.ts ファイルの表示

@@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { VideoChapterComponent } from './video-chapter.component';

describe('VideoChapterComponent', () => {
let component: VideoChapterComponent;
let fixture: ComponentFixture<VideoChapterComponent>;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ VideoChapterComponent ]
})
.compileComponents();
}));

beforeEach(() => {
fixture = TestBed.createComponent(VideoChapterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});

+ 35
- 0
src/app/tabs/courses/video-chapter/video-chapter.component.ts ファイルの表示

@@ -0,0 +1,35 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
import { Location } from '@angular/common';

@Component({
selector: 'app-video-chapter',
templateUrl: './video-chapter.component.html',
styleUrls: ['./video-chapter.component.scss']
})
export class VideoChapterComponent implements OnInit {
selectedSegment: string = 'transcript';
heading: string;
routeSubscription: Subscription;

constructor(
private route: ActivatedRoute,
private location: Location
) { }

ngOnInit(): void {
this.routeSubscription = this.route.params.subscribe((params) => {
this.heading = params['heading'];
});
}

ngOnDestroy() {
this.routeSubscription.unsubscribe();
}

back() {
this.location.back();
}

}