Skip to content

Commit 14f1a20

Browse files
committed
Angular Material Course
1 parent 5ed7817 commit 14f1a20

14 files changed

+199
-30
lines changed

package-lock.json

Lines changed: 13 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"license": "MIT",
55
"scripts": {
66
"ng": "ng",
7-
"start": "ng serve",
7+
"start": "./node_modules/.bin/ng serve --proxy-config ./proxy.json",
8+
"server": "./node_modules/.bin/ts-node ./server/server.ts",
89
"build": "ng build",
910
"test": "ng test",
1011
"lint": "ng lint",
@@ -23,7 +24,6 @@
2324
"@angular/platform-browser": "^5.0.0",
2425
"@angular/platform-browser-dynamic": "^5.0.0",
2526
"@angular/router": "^5.0.0",
26-
"@types/express": "^4.0.39",
2727
"core-js": "^2.4.1",
2828
"express": "^4.16.2",
2929
"hammerjs": "^2.0.8",
@@ -37,6 +37,7 @@
3737
"@types/jasmine": "~2.5.53",
3838
"@types/jasminewd2": "~2.0.2",
3939
"@types/node": "~6.0.60",
40+
"@types/express": "^4.0.39",
4041
"codelyzer": "~3.2.0",
4142
"jasmine-core": "~2.6.2",
4243
"jasmine-spec-reporter": "~4.1.0",

proxy.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"/api": {
3+
"target": "http://localhost:9000",
4+
"secure": false
5+
}
6+
}
File renamed without changes.

server/get-courses.route.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
3+
import {Request, Response} from 'express';
4+
import {COURSES} from "./db-data";
5+
6+
7+
8+
export function getAllCourses(req: Request, res: Response) {
9+
10+
res.status(200).json({payload:Object.values(COURSES)});
11+
12+
}
13+
14+
15+
export function getCourseById(req: Request, res: Response) {
16+
17+
const courseId = req.params["id"];
18+
19+
const courses = Object.values(COURSES);
20+
21+
const course = courses.find(course => course.id == courseId);
22+
23+
res.status(200).json(course);
24+
}

server/search-lessons.route.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
3+
4+
import {Request, Response} from 'express';
5+
import {LESSONS} from "./db-data";
6+
7+
8+
9+
export function searchLessons(req: Request, res: Response) {
10+
11+
const queryParams = req.query;
12+
13+
const filter = queryParams.filter,
14+
sortOrder = queryParams.order,
15+
pageNumber = parseInt(queryParams.pageNumber),
16+
pageSize = parseInt(queryParams.pageSize);
17+
18+
let lessons = Object.values(LESSONS).sort((l1, l2) => l1.id - l2.id);
19+
20+
if (filter) {
21+
lessons = lessons.filter(lesson => lesson.description.toLowerCase().search(filter) >= 0);
22+
}
23+
24+
if (sortOrder === "desc") {
25+
lessons = lessons.reverse();
26+
}
27+
28+
const initialPos = (pageNumber - 1) * pageSize;
29+
30+
const lessonsPage = lessons.slice(initialPos, initialPos + pageSize);
31+
32+
33+
res.status(200).json({payload: lessonsPage});
34+
}

server/server.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
3+
import * as express from 'express';
4+
import {Application} from "express";
5+
import {getAllCourses, getCourseById} from "./get-courses.route";
6+
import {searchLessons} from "./search-lessons.route";
7+
8+
9+
const app: Application = express();
10+
11+
12+
app.route('/api/courses').get(getAllCourses);
13+
14+
app.route('/api/courses/:id').get(getCourseById);
15+
16+
app.route('/api/lessons').get(searchLessons);
17+
18+
19+
20+
21+
const httpServer = app.listen(9000, () => {
22+
console.log("HTTP REST API Server running at http://localhost:" + httpServer.address().port);
23+
});
24+
25+
26+
27+

src/app/app-routing.module.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Routes, RouterModule } from '@angular/router';
33
import {HomeComponent} from "./home/home.component";
44
import {AboutComponent} from "./about/about.component";
55
import {CourseComponent} from "./course/course.component";
6+
import {CourseResolver} from "./services/course.resolver";
67

78
const routes: Routes = [
89
{
@@ -16,7 +17,10 @@ const routes: Routes = [
1617
},
1718
{
1819
path: 'courses/:id',
19-
component: CourseComponent
20+
component: CourseComponent,
21+
resolve: {
22+
course: CourseResolver
23+
}
2024
},
2125
{
2226
path: "**",

src/app/app.module.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import { CourseComponent } from './course/course.component';
1919
import {MatTableModule} from '@angular/material/table';
2020
import {MatInputModule, MatSortModule} from "@angular/material";
2121
import {MatPaginatorModule} from '@angular/material/paginator';
22+
import {CoursesService} from "./services/courses.service";
23+
import {HttpClientModule} from "@angular/common/http";
24+
import {CourseResolver} from "./services/course.resolver";
2225

2326

2427
@NgModule({
@@ -32,6 +35,7 @@ import {MatPaginatorModule} from '@angular/material/paginator';
3235
imports: [
3336
BrowserModule,
3437
BrowserAnimationsModule,
38+
HttpClientModule,
3539
MatMenuModule,
3640
MatButtonModule,
3741
MatIconModule,
@@ -46,7 +50,10 @@ import {MatPaginatorModule} from '@angular/material/paginator';
4650
MatPaginatorModule,
4751
MatSortModule
4852
],
49-
providers: [],
53+
providers: [
54+
CoursesService,
55+
CourseResolver
56+
],
5057
bootstrap: [AppComponent]
5158
})
5259
export class AppModule {

src/app/course/course.component.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import {AfterViewInit, Component, OnInit, ViewChild} from '@angular/core';
22
import {ActivatedRoute} from "@angular/router";
33
import {MatPaginator, MatSort, MatTableDataSource} from "@angular/material";
44
import {Lesson} from "../model/lesson";
5-
import {findCourseById, findLessonsForCourse} from "../model/db-data";
65
import {Course} from "../model/course";
6+
import {CoursesService} from "../services/courses.service";
7+
78

89

910
@Component({
@@ -23,21 +24,15 @@ export class CourseComponent implements OnInit, AfterViewInit {
2324

2425
@ViewChild(MatSort) sort: MatSort;
2526

26-
constructor(private route: ActivatedRoute) {
27+
constructor(private route: ActivatedRoute, private coursesService: CoursesService) {
2728

2829
}
2930

3031
ngOnInit() {
3132

32-
this.route.params.subscribe(params => {
33-
34-
const courseId = params['id'];
35-
36-
this.course = findCourseById(courseId);
37-
38-
this.dataSource.data = findLessonsForCourse(courseId);
33+
this.course = this.route.snapshot.data["course"];
3934

40-
});
35+
// TODO this.dataSource.data = findLessonsForCourse(courseId);
4136

4237
}
4338

0 commit comments

Comments
 (0)