diff --git a/backend/build.gradle b/backend/build.gradle index 7805c9c..1c68989 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -2,6 +2,7 @@ plugins { id 'org.springframework.boot' version '2.7.3' id 'io.spring.dependency-management' version '1.0.13.RELEASE' id 'java' + id 'org.asciidoctor.jvm.convert' version '3.3.2' } group = 'dev.cato447' @@ -28,6 +29,14 @@ dependencies { runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation group: 'org.springframework.restdocs', name: 'spring-restdocs-mockmvc', version: '2.0.6.RELEASE' +} + +asciidoctor { + + sourceDir('build/generated-snippets') + outputDir('build/docs') + } tasks.named('test') { diff --git a/backend/src/test/java/dev/cato447/semesteressen/SemesterEssenApplicationTests.java b/backend/src/test/java/dev/cato447/semesteressen/SemesterEssenApplicationTests.java index 0be4bcd..8b99c9c 100644 --- a/backend/src/test/java/dev/cato447/semesteressen/SemesterEssenApplicationTests.java +++ b/backend/src/test/java/dev/cato447/semesteressen/SemesterEssenApplicationTests.java @@ -1,13 +1,61 @@ package dev.cato447.semesteressen; +import dev.cato447.semesteressen.domain.Event; +import dev.cato447.semesteressen.repository.EventRepository; +import dev.cato447.semesteressen.service.EventService; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import java.time.LocalDateTime; +import java.util.LinkedList; +import java.util.List; + +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) @SpringBootTest class SemesterEssenApplicationTests { + + private MockMvc mockMvc; + + @MockBean + private EventRepository eventRepository; + + @BeforeEach + public void setUp(WebApplicationContext webApplicationContext, + RestDocumentationContextProvider restDocumentation) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(documentationConfiguration(restDocumentation)) + .alwaysDo(document("{method-name}",preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))) + .build(); + } + @Test - void contextLoads() { + public void eventExample() throws Exception { + + List eventList = new LinkedList<>(); + + eventList.add(new Event("Erstiessen #1", false, LocalDateTime.parse("2022-11-12T19:00:00"), 25)); + + when(eventRepository.findAll()).thenReturn(eventList); + + this.mockMvc.perform(get("/api/events")).andExpect(status().isOk()) + .andDo(document("event")); } } diff --git a/frontend/angular.json b/frontend/angular.json index 2b8095d..78b22ab 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -23,6 +23,7 @@ "src/assets" ], "styles": [ + "./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css", "src/styles.css" ], "scripts": [] @@ -90,6 +91,7 @@ "src/assets" ], "styles": [ + "./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css", "src/styles.css" ], "scripts": [] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4f4b7f3..eaaadda 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,10 +9,12 @@ "version": "0.0.0", "dependencies": { "@angular/animations": "^14.2.0", + "@angular/cdk": "^14.2.2", "@angular/common": "^14.2.0", "@angular/compiler": "^14.2.0", "@angular/core": "^14.2.0", "@angular/forms": "^14.2.0", + "@angular/material": "^14.2.2", "@angular/platform-browser": "^14.2.0", "@angular/platform-browser-dynamic": "^14.2.0", "@angular/router": "^14.2.0", @@ -343,6 +345,28 @@ "@angular/core": "14.2.3" } }, + "node_modules/@angular/cdk": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.2.tgz", + "integrity": "sha512-PXEnhX+QDOsmHVVnqTuoGaK7Wn9hFd5kWAmHTTU7lZr3XVu/AtDcEU+LB19wOFU0fY+kSYHMgN+BYo1TiR8vbw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^5.0.0" + }, + "peerDependencies": { + "@angular/common": "^14.0.0 || ^15.0.0", + "@angular/core": "^14.0.0 || ^15.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, "node_modules/@angular/cli": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.3.tgz", @@ -475,6 +499,23 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/material": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.2.tgz", + "integrity": "sha512-jVCaESSTTkLjRvMzSQj294s0Lz1YMVFkl0svrMtWgkUMXHEfx2Vjw6FXdrVrBXlxEIrpfhkTEXVN2DC1kkAkQw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^14.0.0 || ^15.0.0", + "@angular/cdk": "14.2.2", + "@angular/common": "^14.0.0 || ^15.0.0", + "@angular/core": "^14.0.0 || ^15.0.0", + "@angular/forms": "^14.0.0 || ^15.0.0", + "@angular/platform-browser": "^14.0.0 || ^15.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/platform-browser": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.3.tgz", @@ -12101,6 +12142,23 @@ "tslib": "^2.3.0" } }, + "@angular/cdk": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.2.tgz", + "integrity": "sha512-PXEnhX+QDOsmHVVnqTuoGaK7Wn9hFd5kWAmHTTU7lZr3XVu/AtDcEU+LB19wOFU0fY+kSYHMgN+BYo1TiR8vbw==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, "@angular/cli": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.3.tgz", @@ -12179,6 +12237,14 @@ "tslib": "^2.3.0" } }, + "@angular/material": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.2.tgz", + "integrity": "sha512-jVCaESSTTkLjRvMzSQj294s0Lz1YMVFkl0svrMtWgkUMXHEfx2Vjw6FXdrVrBXlxEIrpfhkTEXVN2DC1kkAkQw==", + "requires": { + "tslib": "^2.3.0" + } + }, "@angular/platform-browser": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index f04c3ca..ca62f2d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,10 +11,12 @@ "private": true, "dependencies": { "@angular/animations": "^14.2.0", + "@angular/cdk": "^14.2.2", "@angular/common": "^14.2.0", "@angular/compiler": "^14.2.0", "@angular/core": "^14.2.0", "@angular/forms": "^14.2.0", + "@angular/material": "^14.2.2", "@angular/platform-browser": "^14.2.0", "@angular/platform-browser-dynamic": "^14.2.0", "@angular/router": "^14.2.0", @@ -35,4 +37,4 @@ "karma-jasmine-html-reporter": "~2.0.0", "typescript": "~4.7.2" } -} +} \ No newline at end of file diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index ad8f38f..d8a5b43 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -1,12 +1,15 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { EventListComponent } from './event-list/event-list.component'; -import { EventFormComponent } from './event-form/event-form.component'; +import { EventListComponent } from './views/event-list/event-list.component'; +import { EventFormComponent } from './views/event-create/event-create.component'; +import { EventUpdateComponent } from './views/event-update/event-update.component'; const routes: Routes = [ - {path: "events", component: EventListComponent}, - {path: "create", component: EventFormComponent} + {path: '', pathMatch: 'full', redirectTo: 'event-list'}, + {path: "create-event", component: EventFormComponent}, + {path: "event-list", component: EventListComponent}, + {path: "event-edit/:id", component: EventUpdateComponent}, ]; @NgModule({ diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index 7868461..8f8d957 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -6,10 +6,10 @@

{{ title }}

diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index ecf4a94..cf56b1e 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -1,24 +1,31 @@ +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { AppComponent } from './app.component'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; -import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; -import { AppComponent } from './app.component'; -import { EventListComponent } from './event-list/event-list.component'; -import { EventFormComponent } from './event-form/event-form.component'; -import { EventService } from './service/event-service.service'; + +import { EventListComponent } from './views/event-list/event-list.component'; +import { EventFormComponent } from './views/event-create/event-create.component'; +import { EventService } from './shared/service/event-service.service'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { EventUpdateComponent } from './views/event-update/event-update.component'; @NgModule({ declarations: [ AppComponent, EventListComponent, - EventFormComponent + EventFormComponent, + EventUpdateComponent ], imports: [ BrowserModule, AppRoutingModule, HttpClientModule, - FormsModule + FormsModule, + ReactiveFormsModule, + BrowserAnimationsModule ], providers: [EventService], bootstrap: [AppComponent] diff --git a/frontend/src/app/event-form/event-form.component.html b/frontend/src/app/event-form/event-form.component.html deleted file mode 100644 index 18a6a77..0000000 --- a/frontend/src/app/event-form/event-form.component.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
-
- - -
-
Event name is required
-
- - -
-
- - -
-
DateTime is requiered
-
- - -
-
Max Participants is requiered
- -
-
-
\ No newline at end of file diff --git a/frontend/src/app/event-form/event-form.component.ts b/frontend/src/app/event-form/event-form.component.ts deleted file mode 100644 index fd2d01d..0000000 --- a/frontend/src/app/event-form/event-form.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { EventService } from '../service/event-service.service'; -import { Event } from '../module/event'; - -@Component({ - selector: 'app-event-form', - templateUrl: './event-form.component.html', - styleUrls: ['./event-form.component.css'] -}) -export class EventFormComponent { - - event: Event; - - constructor(private route: ActivatedRoute, private router: Router, private eventService: EventService) { - this.event = new Event(); - } - - onSubmit() { - this.eventService.save(this.event).subscribe(result => this.gotoUserList()); - } - - gotoUserList() { - this.router.navigate(['/events']) - } - -} diff --git a/frontend/src/app/event-list/event-list.component.html b/frontend/src/app/event-list/event-list.component.html deleted file mode 100644 index d2a1ab2..0000000 --- a/frontend/src/app/event-list/event-list.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
- - - - - - - - - - - - - - - - - - - -
#NamePublishedDatetimeMaxParticipants
{{ event.id }}{{ event.name }}{{ event.published }}{{ event.dateTime}}{{ event.maxParticipants }}
-
-
\ No newline at end of file diff --git a/frontend/src/app/event-list/event-list.component.ts b/frontend/src/app/event-list/event-list.component.ts deleted file mode 100644 index 6478ccf..0000000 --- a/frontend/src/app/event-list/event-list.component.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Event } from '../module/event'; -import { EventService } from '../service/event-service.service'; - -@Component({ - selector: 'app-event-list', - templateUrl: './event-list.component.html', - styleUrls: ['./event-list.component.css'] -}) -export class EventListComponent implements OnInit { - - events: Event[]; - - constructor(private eventService: EventService) { - this.events = []; - } - - ngOnInit(): void { - this.eventService.findAll().subscribe(data => { - this.events = data; - }) - } - -} diff --git a/frontend/src/app/module/event.spec.ts b/frontend/src/app/module/event.spec.ts deleted file mode 100644 index 612ada8..0000000 --- a/frontend/src/app/module/event.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Event } from './event'; - -describe('Event', () => { - it('should create an instance', () => { - expect(new Event()).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/module/event.ts b/frontend/src/app/module/event.ts deleted file mode 100644 index d6118ed..0000000 --- a/frontend/src/app/module/event.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class Event { - id!: string; - name!: string; - published!: boolean; - dateTime!: string; - maxParticipants!: number; -} diff --git a/frontend/src/app/service/event-service.service.ts b/frontend/src/app/service/event-service.service.ts deleted file mode 100644 index a456937..0000000 --- a/frontend/src/app/service/event-service.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Event } from '../module/event'; -import { Observable } from 'rxjs'; - -@Injectable() -export class EventService { - - private eventUrl: string; - - constructor(private http: HttpClient) { - this.eventUrl = "http://localhost:8080/api/events" - } - - public findAll(): Observable { - return this.http.get(this.eventUrl) - } - - public save(event: Event) { - return this.http.post(this.eventUrl, event); - } -} diff --git a/frontend/src/app/shared/models/event.ts b/frontend/src/app/shared/models/event.ts new file mode 100644 index 0000000..c087dbe --- /dev/null +++ b/frontend/src/app/shared/models/event.ts @@ -0,0 +1,7 @@ +export interface Event { + id: string, + name: string, + published: boolean, + dateTime: string, + maxParticipants: number +} diff --git a/frontend/src/app/service/event-service.service.spec.ts b/frontend/src/app/shared/service/event-service.service.spec.ts similarity index 100% rename from frontend/src/app/service/event-service.service.spec.ts rename to frontend/src/app/shared/service/event-service.service.spec.ts diff --git a/frontend/src/app/shared/service/event-service.service.ts b/frontend/src/app/shared/service/event-service.service.ts new file mode 100644 index 0000000..0297116 --- /dev/null +++ b/frontend/src/app/shared/service/event-service.service.ts @@ -0,0 +1,57 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Event } from '../models/event'; +import { Observable, throwError } from 'rxjs'; +import { retry, catchError } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', +}) +export class EventService { + + apiUrl = "http://localhost:8080/api"; + + constructor(private http: HttpClient) {} + + httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + }), + }; + + getEvents(): Observable { + return this.http.get(this.apiUrl + '/events').pipe(retry(1), catchError(this.handleError)); + } + + getEvent(id: any): Observable { + return this.http.get(this.apiUrl + '/events/' + id).pipe(retry(1), catchError(this.handleError)); + } + + createEvent(event: any): Observable { + return this.http.post(this.apiUrl + '/events', JSON.stringify(event), this.httpOptions).pipe(retry(1), catchError(this.handleError)); + } + + updateEvent(id: any, event: any): Observable { + return this.http.put(this.apiUrl + '/events/' + id, JSON.stringify(event), this.httpOptions).pipe(retry(1), catchError(this.handleError)); + } + + deleteEvent(id: any): Observable { + return this.http.delete(this.apiUrl + '/events/' + id, this.httpOptions).pipe(retry(1), catchError(this.handleError)); + } + + // Error handling + handleError(error: any) { + let errorMessage = ''; + if (error.error instanceof ErrorEvent) { + // Get client-side error + errorMessage = error.error.message; + } else { + // Get server-side error + errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`; + } + window.alert(errorMessage); + return throwError(() => { + return errorMessage; + }); + } +} diff --git a/frontend/src/app/event-form/event-form.component.css b/frontend/src/app/views/event-create/event-create.component.css similarity index 100% rename from frontend/src/app/event-form/event-form.component.css rename to frontend/src/app/views/event-create/event-create.component.css diff --git a/frontend/src/app/views/event-create/event-create.component.html b/frontend/src/app/views/event-create/event-create.component.html new file mode 100644 index 0000000..698609f --- /dev/null +++ b/frontend/src/app/views/event-create/event-create.component.html @@ -0,0 +1,20 @@ +
+
+

Create Event

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/frontend/src/app/event-form/event-form.component.spec.ts b/frontend/src/app/views/event-create/event-create.component.spec.ts similarity index 89% rename from frontend/src/app/event-form/event-form.component.spec.ts rename to frontend/src/app/views/event-create/event-create.component.spec.ts index d307038..da49639 100644 --- a/frontend/src/app/event-form/event-form.component.spec.ts +++ b/frontend/src/app/views/event-create/event-create.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { EventFormComponent } from './event-form.component'; +import { EventFormComponent } from './event-create.component'; describe('EventFormComponent', () => { let component: EventFormComponent; diff --git a/frontend/src/app/views/event-create/event-create.component.ts b/frontend/src/app/views/event-create/event-create.component.ts new file mode 100644 index 0000000..d8629aa --- /dev/null +++ b/frontend/src/app/views/event-create/event-create.component.ts @@ -0,0 +1,22 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { EventService } from '../../shared/service/event-service.service'; + +@Component({ + selector: 'app-event-create', + templateUrl: './event-create.component.html', + styleUrls: ['./event-create.component.css'] +}) +export class EventFormComponent implements OnInit { + + @Input() eventDetails = {name: '', published: false, dateTime: '', maxParticipants: 0}; + + constructor(private route: ActivatedRoute, private router: Router, private eventService: EventService) { + } + + ngOnInit(): void {} + + addEvent(dataEvent: any){ + this.eventService.createEvent(this.eventDetails).subscribe((data: {}) => {this.router.navigate(['/event-list'])}); + } +} diff --git a/frontend/src/app/event-list/event-list.component.css b/frontend/src/app/views/event-list/event-list.component.css similarity index 100% rename from frontend/src/app/event-list/event-list.component.css rename to frontend/src/app/views/event-list/event-list.component.css diff --git a/frontend/src/app/views/event-list/event-list.component.html b/frontend/src/app/views/event-list/event-list.component.html new file mode 100644 index 0000000..0c246e6 --- /dev/null +++ b/frontend/src/app/views/event-list/event-list.component.html @@ -0,0 +1,43 @@ +
+ +
+

There are no events yet!

+ +
+ +
+

Event List

+
+ + + + + + + + + + + + + + + + + + + + + +
Event IdNamePublishedDatetimeMaxParticipantsAction
{{ event.id }}{{ event.name }}{{ event.published }}{{ event.dateTime }}{{ event.maxParticipants }} + Edit + Delete +
+
+
+
\ No newline at end of file diff --git a/frontend/src/app/event-list/event-list.component.spec.ts b/frontend/src/app/views/event-list/event-list.component.spec.ts similarity index 100% rename from frontend/src/app/event-list/event-list.component.spec.ts rename to frontend/src/app/views/event-list/event-list.component.spec.ts diff --git a/frontend/src/app/views/event-list/event-list.component.ts b/frontend/src/app/views/event-list/event-list.component.ts new file mode 100644 index 0000000..3c57f1f --- /dev/null +++ b/frontend/src/app/views/event-list/event-list.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import { Event } from '../../shared/models/event'; +import { EventService } from '../../shared/service/event-service.service'; + +@Component({ + selector: 'app-event-list', + templateUrl: './event-list.component.html', + styleUrls: ['./event-list.component.css'], +}) +export class EventListComponent implements OnInit { + + Event: any = []; + + constructor(private eventService: EventService) {} + + ngOnInit(): void { + this.loadEvents(); + } + + loadEvents() { + return this.eventService.getEvents().subscribe((data: {}) => { + this.Event = data; + }) + } + + deleteEvent(id: any){ + if(window.confirm('Are you sure, you want to delete?')) { + this.eventService.deleteEvent(id).subscribe((data) => { + this.loadEvents(); + }); + } + } + +} diff --git a/frontend/src/app/views/event-update/event-update.component.css b/frontend/src/app/views/event-update/event-update.component.css new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/views/event-update/event-update.component.html b/frontend/src/app/views/event-update/event-update.component.html new file mode 100644 index 0000000..2feaf0f --- /dev/null +++ b/frontend/src/app/views/event-update/event-update.component.html @@ -0,0 +1,23 @@ +
+
+ +

Update Event

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ diff --git a/frontend/src/app/views/event-update/event-update.component.spec.ts b/frontend/src/app/views/event-update/event-update.component.spec.ts new file mode 100644 index 0000000..3768368 --- /dev/null +++ b/frontend/src/app/views/event-update/event-update.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventUpdateComponent } from './event-update.component'; + +describe('EventUpdateComponent', () => { + let component: EventUpdateComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ EventUpdateComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(EventUpdateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/views/event-update/event-update.component.ts b/frontend/src/app/views/event-update/event-update.component.ts new file mode 100644 index 0000000..8c02668 --- /dev/null +++ b/frontend/src/app/views/event-update/event-update.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { EventService } from 'src/app/shared/service/event-service.service'; + +@Component({ + selector: 'app-event-update', + templateUrl: './event-update.component.html', + styleUrls: ['./event-update.component.css'] +}) +export class EventUpdateComponent implements OnInit { + + id = this.actRoute.snapshot.params['id']; + eventData: any = {}; + + constructor( + public eventService: EventService, + public actRoute: ActivatedRoute, + public router: Router, + ) { } + + ngOnInit(): void { + this.eventService.getEvent(this.id).subscribe((data: {}) => { + this.eventData = data; + }) + } + + updateEvent() { + if(window.confirm('Are you sure, you want to update?')) { + this.eventService.updateEvent(this.id, this.eventData).subscribe((data) => { + this.router.navigate(['/event-list']) + }) + } + } +} diff --git a/frontend/src/index.html b/frontend/src/index.html index f2d7dd0..d12f093 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -10,8 +10,11 @@ href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> + + + - + - + \ No newline at end of file diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 90d4ee0..7e7239a 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -1 +1,4 @@ /* You can add global styles to this file, and also import other style files */ + +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json index 82d91dc..58e2e13 100644 --- a/frontend/tsconfig.app.json +++ b/frontend/tsconfig.app.json @@ -2,6 +2,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "lib": ["es5", "es6", "dom", "dom.iterable"], "outDir": "./out-tsc/app", "types": [] },