From 46af3211601ea394de69e6fd5e247a45b07f11fd Mon Sep 17 00:00:00 2001 From: Heinrich Marks <heinrich.marks@mni.thm.de> Date: Sun, 11 Mar 2018 19:36:23 +0100 Subject: [PATCH] Add answer list & link into content detail view --- src/app/{text-answer.ts => answer-text.ts} | 2 +- src/app/app.module.ts | 8 +++- src/app/content-answer.service.spec.ts | 15 +++++++ src/app/content-answer.service.ts | 43 +++++++++++++++++++ .../content-answers-list.component.html | 9 ++++ .../content-answers-list.component.scss | 0 .../content-answers-list.component.spec.ts | 25 +++++++++++ .../content-answers-list.component.ts | 26 +++++++++++ .../content-detail.component.html | 6 ++- src/app/in-memory-data.service.ts | 35 ++++++++++++++- 10 files changed, 164 insertions(+), 5 deletions(-) rename src/app/{text-answer.ts => answer-text.ts} (85%) create mode 100644 src/app/content-answer.service.spec.ts create mode 100644 src/app/content-answer.service.ts create mode 100644 src/app/content-answers-list/content-answers-list.component.html create mode 100644 src/app/content-answers-list/content-answers-list.component.scss create mode 100644 src/app/content-answers-list/content-answers-list.component.spec.ts create mode 100644 src/app/content-answers-list/content-answers-list.component.ts diff --git a/src/app/text-answer.ts b/src/app/answer-text.ts similarity index 85% rename from src/app/text-answer.ts rename to src/app/answer-text.ts index a4232a41a..14ad44172 100644 --- a/src/app/text-answer.ts +++ b/src/app/answer-text.ts @@ -1,4 +1,4 @@ -export class TextAnswer { +export class AnswerText { id: string; revision: string; contendId: string; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 21673e72b..a31d35189 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -70,6 +70,8 @@ import { CreatorRoomComponent } from './creator-room/creator-room.component'; import { ContentDetailComponent } from './content-detail/content-detail.component'; import { ContentListComponent } from './content-list/content-list.component'; import { ContentService } from './content.service'; +import { ContentAnswersListComponent } from './content-answers-list/content-answers-list.component'; +import { ContentAnswerService } from './content-answer.service'; @NgModule({ declarations: [ @@ -94,7 +96,8 @@ import { ContentService } from './content.service'; ParticipantRoomComponent, CreatorRoomComponent, ContentDetailComponent, - ContentListComponent + ContentListComponent, + ContentAnswersListComponent ], entryComponents: [ RegisterComponent, @@ -151,7 +154,8 @@ import { ContentService } from './content.service'; DataStoreService, RoomService, CommentService, - ContentService + ContentService, + ContentAnswerService ], bootstrap: [AppComponent] }) diff --git a/src/app/content-answer.service.spec.ts b/src/app/content-answer.service.spec.ts new file mode 100644 index 000000000..74b335651 --- /dev/null +++ b/src/app/content-answer.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ContentAnswerService } from './content-answer.service'; + +describe('ContentAnswerService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ContentAnswerService] + }); + }); + + it('should be created', inject([ContentAnswerService], (service: ContentAnswerService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/content-answer.service.ts b/src/app/content-answer.service.ts new file mode 100644 index 000000000..7bbded131 --- /dev/null +++ b/src/app/content-answer.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { AnswerText } from './answer-text'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs/Observable'; +import { catchError, tap } from 'rxjs/operators'; +import { ErrorHandlingService } from './error-handling.service'; + +const httpOptions = { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }) +}; + +@Injectable() +export class ContentAnswerService extends ErrorHandlingService { + + private answerUrl = 'api/answerTexts'; + + constructor(private http: HttpClient) { + super(); + } + + getAnswerTexts(): Observable<AnswerText[]> { + return this.http.get<AnswerText[]>(this.answerUrl).pipe( + tap(_ => ''), + catchError(this.handleError('getAnswerTexts', [])) + ); + } + + addAnswerText(answerText: AnswerText): Observable<AnswerText> { + return this.http.post<AnswerText>(this.answerUrl, answerText, httpOptions).pipe( + tap(_ => ''), + catchError(this.handleError<AnswerText>('addAnswerText')) + ); + } + + getAnswerText(id: string): Observable<AnswerText> { + const url = `${this.answerUrl}/${id}`; + return this.http.get<AnswerText>(url).pipe( + tap(_ => ''), + catchError(this.handleError<AnswerText>(`getAnswerText id=${id}`)) + ); + } + +} diff --git a/src/app/content-answers-list/content-answers-list.component.html b/src/app/content-answers-list/content-answers-list.component.html new file mode 100644 index 000000000..8c691ac46 --- /dev/null +++ b/src/app/content-answers-list/content-answers-list.component.html @@ -0,0 +1,9 @@ +<mat-list> + <h3 mat-subheader>Answers</h3> + <mat-list-item *ngFor="let textAnswer of textAnswers"> + <button mat-button routerLink="{{textAnswer.id}}"> + {{textAnswer.body}} + </button> + </mat-list-item> + </mat-list> + \ No newline at end of file diff --git a/src/app/content-answers-list/content-answers-list.component.scss b/src/app/content-answers-list/content-answers-list.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/content-answers-list/content-answers-list.component.spec.ts b/src/app/content-answers-list/content-answers-list.component.spec.ts new file mode 100644 index 000000000..feaa00d04 --- /dev/null +++ b/src/app/content-answers-list/content-answers-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContentAnswersListComponent } from './content-answers-list.component'; + +describe('ContentAnswersListComponent', () => { + let component: ContentAnswersListComponent; + let fixture: ComponentFixture<ContentAnswersListComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ContentAnswersListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ContentAnswersListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/content-answers-list/content-answers-list.component.ts b/src/app/content-answers-list/content-answers-list.component.ts new file mode 100644 index 000000000..1b9efed7c --- /dev/null +++ b/src/app/content-answers-list/content-answers-list.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; +import { ContentAnswerService } from '../content-answer.service'; +import { AnswerText } from '../answer-text'; + +@Component({ + selector: 'app-content-answers-list', + templateUrl: './content-answers-list.component.html', + styleUrls: ['./content-answers-list.component.scss'] +}) +export class ContentAnswersListComponent implements OnInit { + textAnswers: AnswerText[]; + + constructor(private ContentAnswerService: ContentAnswerService ) { } + + ngOnInit() { + this.getAnswerTexts(); + } + + getAnswerTexts(): void { + this.ContentAnswerService.getAnswerTexts(). + subscribe(textAnswers => { + this.textAnswers = textAnswers; + }) + } + +} diff --git a/src/app/content-detail/content-detail.component.html b/src/app/content-detail/content-detail.component.html index b631f32f0..1abb21f9a 100644 --- a/src/app/content-detail/content-detail.component.html +++ b/src/app/content-detail/content-detail.component.html @@ -12,6 +12,10 @@ <p> {{ content.body }} </p> + <mat-divider></mat-divider> + <div> + <app-content-answers-list></app-content-answers-list> + </div> </mat-card-content> <mat-divider></mat-divider> <!-- answes list here --> @@ -19,7 +23,7 @@ <button mat-button color="primary" matTooltip="Create new content" routerLink="/creator/room/{{content.id}}/content-creation"> Create answer </button> - <button mat-button color="warn" matTooltip="Delete selected room"> + <button mat-button color="warn" matTooltip="Delete selected answer"> <!-- on click, add a 'x' on the right end of each answer to make it deletable --> Delete answer </button> diff --git a/src/app/in-memory-data.service.ts b/src/app/in-memory-data.service.ts index 0653594a3..dd0271cdf 100644 --- a/src/app/in-memory-data.service.ts +++ b/src/app/in-memory-data.service.ts @@ -102,6 +102,39 @@ export class InMemoryDataService implements InMemoryDbService { format: Format.TEXT } ]; - return { rooms, comments, contents }; + + const answerTexts = [ + { + id: '1', + revision: '1', + contendId: '1', + round: '1', + subject: 'Textaufgabe 1', + body: 'gamma, delta', + read: 'yes', + creationTimestamp: Date, + }, + { + id: '1', + revision: '1', + contendId: '1', + round: '1', + subject: 'Textaufgabe 1', + body: 'epsilon, phi', + read: 'yes', + creationTimestamp: Date, + }, + { + id: '2', + revision: '2', + contendId: '2', + round: '3', + subject: 'Textaufgabe 2', + body: 'Der Turm ist 20m hoch', + read: 'yes', + creationTimestamp: Date, + } + ] + return { rooms, comments, contents, answerTexts }; } } -- GitLab