diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java
index 265200d96e..204b4a0c77 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java
@@ -1,15 +1,11 @@
package com.baeldung.spring.cloud.bootstrap.gateway;
-import com.baeldung.spring.cloud.bootstrap.gateway.filter.CsrfHeaderFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.web.csrf.CsrfFilter;
-import org.springframework.security.web.csrf.CsrfTokenRepository;
-import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
@EnableWebSecurity
@Configuration
@@ -27,8 +23,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
- .loginPage("/login.html")
- .loginProcessingUrl("/login")
.defaultSuccessUrl("/home/index.html", true)
.and()
.authorizeRequests()
@@ -39,13 +33,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.and()
.logout()
.and()
- .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
- .csrf().csrfTokenRepository(csrfTokenRepository());
- }
-
- private CsrfTokenRepository csrfTokenRepository() {
- HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
- repository.setHeaderName("X-XSRF-TOKEN");
- return repository;
+ .csrf().disable();
}
}
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/CsrfHeaderFilter.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/CsrfHeaderFilter.java
deleted file mode 100644
index c9c10db3fc..0000000000
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/CsrfHeaderFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.spring.cloud.bootstrap.gateway.filter;
-
-import org.springframework.security.web.csrf.CsrfToken;
-import org.springframework.web.filter.OncePerRequestFilter;
-import org.springframework.web.util.WebUtils;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class CsrfHeaderFilter extends OncePerRequestFilter {
- @Override
- protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
- CsrfToken csrfToken = (CsrfToken) httpServletRequest.getAttribute(CsrfToken.class.getName());
- if (csrfToken != null) {
- Cookie cookie = WebUtils.getCookie(httpServletRequest, "XSRF-TOKEN");
- String token = csrfToken.getToken();
- if (cookie == null || token != null && !token.equals(cookie.getValue())) {
- cookie = new Cookie("XSRF-TOKEN", token);
- cookie.setPath("/");
- httpServletResponse.addCookie(cookie);
- }
- }
- filterChain.doFilter(httpServletRequest, httpServletResponse);
- }
-}
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map
index 2611f5ecf5..676177396e 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///./src/app/app.component.css","webpack:///./src/app/book/book-detail/book-detail.component.css","webpack:///./src/app/book/book-list/book-list.component.css","webpack:///./src/app/rating/rating.component.css","webpack:///./src/app/app.component.html","webpack:///./src/app/book/book-detail/book-detail.component.html","webpack:///./src/app/book/book-list/book-list.component.html","webpack:///./src/app/rating/rating.component.html","webpack:///./src/app/http.service.ts","webpack:///./src/app/principal.ts","webpack:///./src/app/book.ts","webpack:///./src async","webpack:///./src/main.ts","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/book/book-detail/book-detail.component.ts","webpack:///./src/app/book/book-list/book-list.component.ts","webpack:///./src/app/click-stop-propagation.directive.ts","webpack:///./src/app/rating.ts","webpack:///./src/app/rating/rating.component.ts","webpack:///./src/environments/environment.ts"],"names":[],"mappings":"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","file":"main.bundle.js","sourcesContent":["exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".custom-close {\\r\\n float:right;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.css\n// module id = 144\n// module chunks = 1","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \"\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-detail/book-detail.component.css\n// module id = 145\n// module chunks = 1","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".custom-close {\\r\\n float:right;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-list/book-list.component.css\n// module id = 146\n// module chunks = 1","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \"div.progress {\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.rating:hover {\\r\\n border: solid blue;\\r\\n}\\r\\n\\r\\n.selected {\\r\\n border: solid blue;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/rating/rating.component.css\n// module id = 147\n// module chunks = 1","module.exports = \"\\r\\n\\r\\n
\\r\\n
\\r\\n
Book Rater App
\\r\\n
Anyone can view the books.
\\r\\n
Users can view and create ratings
\\r\\n
Admins can do anything!
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.html\n// module id = 149\n// module chunks = 1","module.exports = \"\\r\\n
\\r\\n
\\r\\n
Title: {{selectedBook.title}}
\\r\\n
Author: {{selectedBook.author}}
\\r\\n
A quick summary of the book
\\r\\n
\\r\\n
\\r\\n
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-detail/book-detail.component.html\n// module id = 150\n// module chunks = 1","module.exports = \"\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Title: {{book.title}}
\\r\\n Author: {{book.author}}
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Add New Book
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-list/book-list.component.html\n// module id = 151\n// module chunks = 1","module.exports = \"Ratings:\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/rating/rating.component.html\n// module id = 152\n// module chunks = 1","import {Injectable} from \"@angular/core\";\r\nimport {Observable} from \"rxjs\";\r\nimport {Response, Http, Headers, RequestOptions} from \"@angular/http\";\r\nimport {Book} from \"./book\";\r\nimport {Rating} from \"./rating\";\r\n\r\n@Injectable()\r\nexport class HttpService {\r\n\r\n constructor(private http: Http) { }\r\n\r\n me(): Observable {\r\n return this.http.get(\"/me\", this.makeOptions())\r\n }\r\n\r\n logout(): Observable {\r\n return this.http.post(\"/logout\", '', this.makeOptions())\r\n }\r\n\r\n getBooks(): Observable {\r\n return this.http.get(\"/book-service/books\", this.makeOptions())\r\n }\r\n\r\n updateBook(newBook: Book): Observable {\r\n return this.http.put(\"/book-service/books/\" + newBook.id, newBook, this.makeOptions())\r\n }\r\n\r\n deleteBook(book: Book): Observable {\r\n return this.http.delete(\"/book-service/books/\" + book.id, this.makeOptions())\r\n }\r\n\r\n createBook(newBook: Book): Observable {\r\n return this.http.post(\"/book-service/books\", newBook, this.makeOptions())\r\n }\r\n\r\n getRatings(bookId: number): Observable {\r\n return this.http.get(\"/rating-service/ratings?bookId=\" + bookId, this.makeOptions())\r\n }\r\n\r\n createRating(rating: Rating): Observable {\r\n return this.http.post(\"/rating-service/ratings\", rating, this.makeOptions())\r\n }\r\n\r\n deleteRating(ratingId: number) {\r\n return this.http.delete(\"/rating-service/ratings/\" + ratingId, this.makeOptions())\r\n }\r\n\r\n updateRating(rating: Rating) {\r\n return this.http.put(\"/rating-service/ratings/\" + rating.id, rating, this.makeOptions())\r\n }\r\n\r\n private makeOptions(): RequestOptions {\r\n let headers = new Headers({'Content-Type': 'application/json'});\r\n return new RequestOptions({headers: headers});\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/http.service.ts","export class Principal {\r\n public authenticated: boolean;\r\n public authorities: Authority[] = [];\r\n\r\n constructor(authenticated: boolean, authorities: any[]) {\r\n this.authenticated = authenticated;\r\n authorities.map(auth => this.authorities.push(new Authority(auth.authority)))\r\n }\r\n\r\n isAdmin() {\r\n return this.authorities.some((auth: Authority) => auth.authority.indexOf('ADMIN') > -1)\r\n }\r\n}\r\n\r\nexport class Authority {\r\n public authority: String;\r\n\r\n constructor(authority: String) {\r\n this.authority = authority;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/principal.ts","export class Book {\r\n id: number;\r\n author: String;\r\n title: String;\r\n constructor(id: number, author: String, title: String){\r\n this.id = id;\r\n this.author = author;\r\n this.title = title;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book.ts","function webpackEmptyContext(req) {\n\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 74;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src async\n// module id = 74\n// module chunks = 1","import {enableProdMode} from \"@angular/core\";\r\nimport {platformBrowserDynamic} from \"@angular/platform-browser-dynamic\";\r\nimport {AppModule} from \"./app/app.module\";\r\nimport {environment} from \"./environments/environment\";\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule);\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.ts","import {Component} from \"@angular/core\";\r\nimport {Principal} from \"./principal\";\r\nimport {Response} from \"@angular/http\";\r\nimport {NgForm} from \"@angular/forms\";\r\nimport {Book} from \"./book\";\r\nimport {HttpService} from \"./http.service\";\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent {\r\n selectedBook: Book = null;\r\n principal: Principal = new Principal(false, []);\r\n loginFailed: boolean = false;\r\n\r\n constructor(private httpService: HttpService){}\r\n\r\n ngOnInit(): void {\r\n this.httpService.me()\r\n .subscribe((response: Response) => {\r\n let principalJson = response.json();\r\n this.principal = new Principal(principalJson.authenticated, principalJson.authorities);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n onLogout() {\r\n this.httpService.logout()\r\n .subscribe((response: Response) => {\r\n if (response.status === 200) {\r\n this.loginFailed = false;\r\n this.principal = new Principal(false, []);\r\n window.location.replace(response.url);\r\n }\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n closeBookDetail() {\r\n this.selectedBook = null;\r\n }\r\n\r\n selectBook(book: Book) {\r\n this.selectedBook = book;\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts","import {BrowserModule} from \"@angular/platform-browser\";\r\nimport {NgModule} from \"@angular/core\";\r\nimport {FormsModule} from \"@angular/forms\";\r\nimport {HttpModule} from \"@angular/http\";\r\nimport {AppComponent} from \"./app.component\";\r\nimport {RatingComponent} from \"./rating/rating.component\";\r\nimport {ClickStopPropagationDirective} from \"./click-stop-propagation.directive\";\r\nimport {BookDetailComponent} from \"./book/book-detail/book-detail.component\";\r\nimport {BookListComponent} from \"./book/book-list/book-list.component\";\r\nimport {HttpService} from \"./http.service\";\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n RatingComponent,\r\n ClickStopPropagationDirective,\r\n BookDetailComponent,\r\n BookListComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n FormsModule,\r\n HttpModule\r\n ],\r\n providers: [HttpService],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","import {Component, OnInit, Input, Output, EventEmitter} from \"@angular/core\";\r\nimport {Book} from \"../../book\";\r\nimport {Principal} from \"../../principal\";\r\n\r\n@Component({\r\n selector: 'app-book-detail',\r\n templateUrl: './book-detail.component.html',\r\n styleUrls: ['./book-detail.component.css']\r\n})\r\nexport class BookDetailComponent implements OnInit {\r\n\r\n @Input() selectedBook: Book = null;\r\n @Input() principal: Principal = null;\r\n @Output() closeBook: EventEmitter = new EventEmitter();\r\n\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n closeBookDetail() {\r\n this.closeBook.emit(null);\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book/book-detail/book-detail.component.ts","import {Component, OnInit, Input, Output, EventEmitter} from \"@angular/core\";\r\nimport {Principal} from \"../../principal\";\r\nimport {Book} from \"../../book\";\r\nimport {Response} from \"@angular/http\";\r\nimport {HttpService} from \"../../http.service\";\r\n\r\n@Component({\r\n selector: 'app-book-list',\r\n templateUrl: './book-list.component.html',\r\n styleUrls: ['./book-list.component.css']\r\n})\r\nexport class BookListComponent implements OnInit {\r\n\r\n @Input() principal: Principal = null;\r\n @Output() onBookSelected: EventEmitter = new EventEmitter();\r\n\r\n books: Book[] = [];\r\n newBooks: Book[] = [];\r\n newBook: Book = new Book(Math.floor(Math.random() * 1000), '', '');\r\n booksToEdit: number[] = [];\r\n isAddNewBook: boolean = false;\r\n selectedBook: Book = null;\r\n\r\n constructor(private httpService: HttpService) { }\r\n\r\n ngOnInit() {\r\n this.loadBooks();\r\n }\r\n\r\n loadBooks() {\r\n this.httpService.getBooks()\r\n .subscribe((response: Response) => {\r\n let booksJson: any[] = response.json()\r\n booksJson.forEach(book => {\r\n this.books.push(new Book(book.id, book.author, book.title));\r\n this.newBooks.push(new Book(book.id, book.author, book.title));\r\n })\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n cancelEditBook(bookIndex: number) {\r\n if (this.booksToEdit.indexOf(bookIndex) !== -1) {\r\n this.booksToEdit.splice(this.booksToEdit.indexOf(bookIndex), 1); //remove the index of the book to edit\r\n //get the original book\r\n let bookCopy: Book = new Book(this.books[bookIndex].id, this.books[bookIndex].author, this.books[bookIndex].title);\r\n this.newBooks.splice(bookIndex,1,bookCopy); //replace the edited book with the old book\r\n }\r\n }\r\n\r\n editBook(bookIndex: number) {\r\n this.booksToEdit.push(bookIndex);\r\n }\r\n\r\n saveBook(bookIndex: number, newBook: Book) {\r\n console.log(newBook);\r\n //save the book to the database\r\n this.httpService.updateBook(newBook)\r\n .subscribe((response: Response) => {\r\n let bookJson = response.json();\r\n let book: Book = new Book(bookJson.id, bookJson.author, bookJson.title);\r\n //update the current array of books\r\n let bookArr: Book = this.books.find(b => b.id === book.id);\r\n bookArr.title = book.title;\r\n bookArr.author = book.author;\r\n this.booksToEdit.splice(this.booksToEdit.indexOf(bookIndex), 1); //remove the index of the book to edit\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n\r\n\r\n }\r\n\r\n delete(bookIndex: number) {\r\n let book: Book = this.books[bookIndex];\r\n this.httpService.deleteBook(book)\r\n .subscribe(() => {\r\n if (this.selectedBook !== null && this.books[bookIndex].id === this.selectedBook.id) {\r\n this.selectedBook = null;\r\n this.onBookSelected.emit(this.selectedBook);\r\n }\r\n\r\n this.books.splice(bookIndex, 1); //remove the book at this index;\r\n this.newBooks.splice(bookIndex, 1); //remove the editing book at this index\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n activateAddNewBook() {\r\n this.isAddNewBook = true;\r\n this.newBook = new Book(null, '', '');\r\n }\r\n\r\n addNewBook(newBook: Book, element: any) {\r\n //write new book to db\r\n this.httpService.createBook(newBook)\r\n .subscribe((response: Response) => {\r\n let bookJson = response.json();\r\n let book: Book = new Book(bookJson.id, bookJson.author, bookJson.title);\r\n console.log(book);\r\n this.books.push(book);\r\n this.newBooks.push(book);\r\n this.newBook = new Book(Math.floor(Math.random() * 1000), '', '');\r\n element.focus();\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n cancelAddBook() {\r\n this.isAddNewBook = false;\r\n }\r\n\r\n\r\n selectBook(book: Book) {\r\n this.selectedBook = book;\r\n this.onBookSelected.emit(book);\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book/book-list/book-list.component.ts","import {Directive, HostListener} from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[appClickStopPropagation]'\r\n})\r\nexport class ClickStopPropagationDirective\r\n{\r\n @HostListener(\"click\", [\"$event\"])\r\n public onClick(event: any): void\r\n {\r\n event.stopPropagation();\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/click-stop-propagation.directive.ts","export class Rating{\r\n id: number;\r\n bookId: number;\r\n stars: number;\r\n\r\n constructor(id: number, bookId: number, stars: number) {\r\n this.id = id;\r\n this.bookId = bookId;\r\n this.stars = stars;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/rating.ts","import {Component, OnInit, Input, OnChanges} from \"@angular/core\";\r\nimport {Rating} from \"../rating\";\r\nimport {Principal} from \"../principal\";\r\nimport {HttpService} from \"../http.service\";\r\nimport {Response} from \"@angular/http\";\r\n\r\n@Component({\r\n selector: 'app-rating',\r\n templateUrl: './rating.component.html',\r\n styleUrls: ['./rating.component.css']\r\n})\r\nexport class RatingComponent implements OnInit, OnChanges {\r\n\r\n @Input() bookId: number;\r\n @Input() principal: Principal = null;\r\n ratings: Rating[] = [];\r\n stars: number[] = [1,2,3,4,5];\r\n newRating: Rating = null;\r\n\r\n constructor(private httpService: HttpService) { }\r\n\r\n ngOnInit() {}\r\n\r\n ngOnChanges() {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n this.ratings = [];\r\n this.loadRatings();\r\n }\r\n\r\n findWidth(rating: Rating): String {\r\n let percent: number = (rating.stars/5)*100;\r\n return percent.toString() + '%';\r\n }\r\n\r\n private loadRatings() {\r\n this.httpService.getRatings(this.bookId)\r\n .subscribe((response: Response) => {\r\n let responseJson: any[] = response.json();\r\n responseJson.forEach(rating => this.ratings.push(new Rating(rating.id, rating.bookId, rating.stars)))\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n onSaveRating() {\r\n console.log(this.newRating);\r\n let ratingCopy: Rating = Object.assign({}, this.newRating);\r\n this.httpService.createRating(ratingCopy)\r\n .subscribe((response: Response) => {\r\n let ratingJson = response.json()\r\n this.ratings.push(new Rating(ratingJson.id, ratingJson.bookId, ratingJson.stars))\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n updateRating() {\r\n this.httpService.updateRating(this.newRating)\r\n .subscribe(() => {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n selectRating(rating: Rating) {\r\n if (this.principal.isAdmin()) {\r\n this.newRating = rating;\r\n }\r\n }\r\n\r\n cancelSelection() {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }\r\n\r\n deleteRating(index: number) {\r\n let rating = this.ratings[index];\r\n this.httpService.deleteRating(rating.id)\r\n .subscribe(() => {\r\n if (this.ratings[index] === this.newRating) {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }\r\n this.ratings.splice(index, 1);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/rating/rating.component.ts","// The file contents for the current environment will overwrite these during build.\r\n// The build system defaults to the dev environment which uses `environment.ts`, but if you do\r\n// `ng build --env=prod` then `environment.prod.ts` will be used instead.\r\n// The list of which env maps to which file can be found in `.angular-cli.json`.\r\n\r\nexport const environment = {\r\n production: false\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/environments/environment.ts"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///./src/app/app.component.css","webpack:///./src/app/book/book-detail/book-detail.component.css","webpack:///./src/app/book/book-list/book-list.component.css","webpack:///./src/app/rating/rating.component.css","webpack:///./src/app/app.component.html","webpack:///./src/app/book/book-detail/book-detail.component.html","webpack:///./src/app/book/book-list/book-list.component.html","webpack:///./src/app/rating/rating.component.html","webpack:///./src/app/http.service.ts","webpack:///./src/app/principal.ts","webpack:///./src/app/book.ts","webpack:///./src async","webpack:///./src/main.ts","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/book/book-detail/book-detail.component.ts","webpack:///./src/app/book/book-list/book-list.component.ts","webpack:///./src/app/click-stop-propagation.directive.ts","webpack:///./src/app/rating.ts","webpack:///./src/app/rating/rating.component.ts","webpack:///./src/environments/environment.ts"],"names":[],"mappings":";;;;;AAAA;AACA;;;AAGA;AACA,wCAAyC,kBAAkB,KAAK;;AAEhE;;;AAGA;AACA,2C;;;;;;;ACXA;AACA;;;AAGA;AACA;;AAEA;;;AAGA;AACA,2C;;;;;;;ACXA;AACA;;;AAGA;AACA,wCAAyC,kBAAkB,KAAK;;AAEhE;;;AAGA;AACA,2C;;;;;;;ACXA;AACA;;;AAGA;AACA,uCAAwC,sBAAsB,KAAK,uBAAuB,yBAAyB,KAAK,mBAAmB,yBAAyB,KAAK;;AAEzK;;;AAGA;AACA,2C;;;;;;;ACXA,ywD;;;;;;;ACAA,qNAAqN,kEAAkE,oBAAoB,mEAAmE,qBAAqB,wN;;;;;;;ACAnY,sEAAsE,eAAe,kJAAkJ,+bAA+b,YAAY,uEAAuE,aAAa,2qCAA2qC,kvC;;;;;;;ACAj7D,kEAAkE,eAAe,8FAA8F,uFAAuF,scAAsc,sLAAsL,eAAe,0KAA0K,MAAM,4e;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAxhC;AAE6B;AAKtE,IAAa,WAAW;IAEtB,qBAAoB,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAI,CAAC;IAEnC,wBAAE,GAAF;QACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC;IAED,4BAAM,GAAN;QACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC;IAED,8BAAQ,GAAR;QACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACjE,CAAC;IAED,gCAAU,GAAV,UAAW,OAAa;QACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACzF,CAAC;IAED,gCAAU,GAAV,UAAW,IAAU;QACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChF,CAAC;IAED,gCAAU,GAAV,UAAW,OAAa;QACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,OAAO,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5E,CAAC;IAED,gCAAU,GAAV,UAAW,MAAc;QACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,GAAG,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACvF,CAAC;IAED,kCAAY,GAAZ,UAAa,MAAc;QACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC/E,CAAC;IAED,kCAAY,GAAZ,UAAa,QAAgB;QAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,GAAG,QAAQ,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrF,CAAC;IAED,kCAAY,GAAZ,UAAa,MAAc;QACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,GAAG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3F,CAAC;IAEO,iCAAW,GAAnB;QACE,IAAI,OAAO,GAAG,IAAI,8DAAO,CAAC,EAAC,cAAc,EAAE,kBAAkB,EAAC,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,qEAAc,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;IAChD,CAAC;IACH,kBAAC;AAAD,CAAC;AAhDY,WAAW;IADvB,wFAAU,EAAE;yDAGe,2DAAI,oBAAJ,2DAAI;GAFnB,WAAW,CAgDvB;AAhDuB;;;;;;;;;;;ACPxB;AAAA;IAIE,mBAAY,aAAsB,EAAE,WAAkB;QAAtD,iBAGC;QALM,gBAAW,GAAgB,EAAE,CAAC;QAGnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,cAAI,IAAI,YAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAApD,CAAoD,CAAC;IAC/E,CAAC;IAED,2BAAO,GAAP;QACE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAC,IAAe,IAAK,WAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAApC,CAAoC,CAAC;IACzF,CAAC;IACH,gBAAC;AAAD,CAAC;;AAED;IAGE,mBAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACH,gBAAC;AAAD,CAAC;;;;;;;;;;ACpBD;AAAA;IAIE,cAAY,EAAU,EAAE,MAAc,EAAE,KAAa;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACH,WAAC;AAAD,CAAC;;;;;;;;;ACTD;AACA;AACA;AACA,uCAAuC,WAAW;AAClD;AACA;AACA;;;;;;;;;;;;;;ACN6C;AAC4B;AAC9B;AACY;AAEvD,EAAE,CAAC,CAAC,8EAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3B,4FAAc,EAAE,CAAC;AACnB,CAAC;AAED,wHAAsB,EAAE,CAAC,eAAe,CAAC,kEAAS,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;ACTZ;AACF;AAGK;AAO3C,IAAa,YAAY;IAKvB,sBAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAJ5C,iBAAY,GAAS,IAAI,CAAC;QAC1B,cAAS,GAAc,IAAI,6DAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChD,gBAAW,GAAY,KAAK,CAAC;IAEiB,CAAC;IAE/C,+BAAQ,GAAR;QAAA,iBAQC;QAPC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;aAClB,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,KAAI,CAAC,SAAS,GAAG,IAAI,6DAAS,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QACzF,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+BAAQ,GAAR;QAAA,iBAWC;QAVC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;aACtB,SAAS,CAAC,UAAC,QAAkB;YAC5B,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,KAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,KAAI,CAAC,SAAS,GAAG,IAAI,6DAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sCAAe,GAAf;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,iCAAU,GAAV,UAAW,IAAU;QACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAEH,mBAAC;AAAD,CAAC;AAtCY,YAAY;IALxB,wFAAS,CAAC;QACT,QAAQ,EAAE,UAAU;QACpB,kCAAmC;QACnC,kCAAkC;KACnC,CAAC;yDAMiC,kEAAW,oBAAX,kEAAW;GALjC,YAAY,CAsCxB;AAtCwB;;;;;;;;;;;;;;;;;;;;;;;;;;;ACX+B;AACjB;AACI;AACF;AACI;AACa;AACuB;AACJ;AACN;AAC5B;AAkB3C,IAAa,SAAS;IAAtB;IAAyB,CAAC;IAAD,gBAAC;AAAD,CAAC;AAAb,SAAS;IAhBrB,sFAAQ,CAAC;QACR,YAAY,EAAE;YACZ,oEAAY;YACZ,iFAAe;YACf,wGAA6B;YAC7B,oGAAmB;YACnB,8FAAiB;SAClB;QACD,OAAO,EAAE;YACP,gFAAa;YACb,mEAAW;YACX,iEAAU;SACX;QACD,SAAS,EAAE,CAAC,kEAAW,CAAC;QACxB,SAAS,EAAE,CAAC,oEAAY,CAAC;KAC1B,CAAC;GACW,SAAS,CAAI;AAAJ;;;;;;;;;;;;;;;;;;;;;;AC3BuD;AAC7C;AACU;AAO1C,IAAa,mBAAmB;IAO9B;QALS,iBAAY,GAAS,IAAI,CAAC;QAC1B,cAAS,GAAc,IAAI,CAAC;QAC3B,cAAS,GAAsB,IAAI,mEAAY,EAAO,CAAC;IAGjD,CAAC;IAEjB,sCAAQ,GAAR;IACA,CAAC;IAED,6CAAe,GAAf;QACE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEH,0BAAC;AAAD,CAAC;AAdU;IAAR,mFAAK,EAAE;kDAAe,mDAAI,oBAAJ,mDAAI;yDAAQ;AAC1B;IAAR,mFAAK,EAAE;kDAAY,6DAAS,oBAAT,6DAAS;sDAAQ;AAC3B;IAAT,qFAAM,EAAE;kDAAY,mEAAY,oBAAZ,mEAAY;sDAAgC;AAJtD,mBAAmB;IAL/B,wFAAS,CAAC;QACT,QAAQ,EAAE,iBAAiB;QAC3B,kCAA2C;QAC3C,kCAA0C;KAC3C,CAAC;;GACW,mBAAmB,CAgB/B;AAhB+B;;;;;;;;;;;;;;;;;;;;;;;;ACT6C;AACnC;AACV;AAEe;AAO/C,IAAa,iBAAiB;IAY5B,2BAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAVnC,cAAS,GAAc,IAAI,CAAC;QAC3B,mBAAc,GAAuB,IAAI,mEAAY,EAAQ,CAAC;QAExE,UAAK,GAAW,EAAE,CAAC;QACnB,aAAQ,GAAW,EAAE,CAAC;QACtB,YAAO,GAAS,IAAI,mDAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,gBAAW,GAAa,EAAE,CAAC;QAC3B,iBAAY,GAAY,KAAK,CAAC;QAC9B,iBAAY,GAAS,IAAI,CAAC;IAEsB,CAAC;IAEjD,oCAAQ,GAAR;QACE,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,qCAAS,GAAT;QAAA,iBAWC;QAVC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;aACxB,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,SAAS,GAAU,QAAQ,CAAC,IAAI,EAAE;YACtC,SAAS,CAAC,OAAO,CAAC,cAAI;gBACpB,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,mDAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5D,KAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,mDAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC;QACJ,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,0CAAc,GAAd,UAAe,SAAiB;QAC9B,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sCAAsC;YACvG,uBAAuB;YACvB,IAAI,QAAQ,GAAS,IAAI,mDAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;YACnH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAC,CAAC,EAAC,QAAQ,CAAC,CAAC,CAAC,2CAA2C;QACzF,CAAC;IACH,CAAC;IAED,oCAAQ,GAAR,UAAS,SAAiB;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,oCAAQ,GAAR,UAAS,SAAiB,EAAE,OAAa;QAAzC,iBAiBC;QAhBC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,+BAA+B;QAC/B,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;aACjC,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,GAAS,IAAI,mDAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxE,mCAAmC;YACnC,IAAI,OAAO,GAAS,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAC,IAAI,QAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAhB,CAAgB,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,KAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,sCAAsC;QACzG,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IAGP,CAAC;IAED,kCAAM,GAAN,UAAO,SAAiB;QAAxB,iBAcC;QAbC,IAAI,IAAI,GAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;aAC9B,SAAS,CAAC;YACT,EAAE,CAAC,CAAC,KAAI,CAAC,YAAY,KAAK,IAAI,IAAI,KAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,KAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpF,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;YAED,KAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,gCAAgC;YACjE,KAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,uCAAuC;QAC7E,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,8CAAkB,GAAlB;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,mDAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,sCAAU,GAAV,UAAW,OAAa,EAAE,OAAY;QAAtC,iBAcC;QAbC,sBAAsB;QACtB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;aACjC,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,GAAS,IAAI,mDAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,KAAI,CAAC,OAAO,GAAG,IAAI,mDAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yCAAa,GAAb;QACE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAGD,sCAAU,GAAV,UAAW,IAAU;QACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEH,wBAAC;AAAD,CAAC;AA5GU;IAAR,mFAAK,EAAE;kDAAY,6DAAS,oBAAT,6DAAS;oDAAQ;AAC3B;IAAT,qFAAM,EAAE;kDAAiB,mEAAY,oBAAZ,mEAAY;yDAAkC;AAH7D,iBAAiB;IAL7B,wFAAS,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,kCAAyC;QACzC,kCAAwC;KACzC,CAAC;yDAaiC,kEAAW,oBAAX,kEAAW;GAZjC,iBAAiB,CA8G7B;AA9G6B;;;;;;;;;;;;;;;;;;;;;ACXwB;AAKtD,IAAa,6BAA6B;IAA1C;IAOA,CAAC;IAJQ,+CAAO,GAAd,UAAe,KAAU;QAEvB,KAAK,CAAC,eAAe,EAAE,CAAC;IAC1B,CAAC;IACH,oCAAC;AAAD,CAAC;AAJC;IADC,2FAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;;;;4DAIjC;AANU,6BAA6B;IAHzC,uFAAS,CAAC;QACT,QAAQ,EAAE,2BAA2B;KACtC,CAAC;GACW,6BAA6B,CAOzC;AAPyC;;;;;;;;;ACL1C;AAAA;IAKE,gBAAY,EAAU,EAAE,MAAc,EAAE,KAAa;QACnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACH,aAAC;AAAD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ACViE;AACjC;AACM;AACK;AAQ5C,IAAa,eAAe;IAQ1B,yBAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QALnC,cAAS,GAAc,IAAI,CAAC;QACrC,YAAO,GAAa,EAAE,CAAC;QACvB,UAAK,GAAa,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC9B,cAAS,GAAW,IAAI,CAAC;IAEuB,CAAC;IAEjD,kCAAQ,GAAR,cAAY,CAAC;IAEb,qCAAW,GAAX;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,uDAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,mCAAS,GAAT,UAAU,MAAc;QACtB,IAAI,OAAO,GAAW,CAAC,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,GAAG,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;IAClC,CAAC;IAEO,qCAAW,GAAnB;QAAA,iBAQC;QAPC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;aACrC,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,YAAY,GAAU,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,gBAAM,IAAI,YAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,uDAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAArE,CAAqE,CAAC;QACvG,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sCAAY,GAAZ;QAAA,iBAUC;QATC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,UAAU,GAAW,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC;aACtC,SAAS,CAAC,UAAC,QAAkB;YAC5B,IAAI,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE;YAChC,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,uDAAM,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sCAAY,GAAZ;QAAA,iBAOC;QANC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;aAC1C,SAAS,CAAC;YACT,KAAI,CAAC,SAAS,GAAG,IAAI,uDAAM,CAAC,IAAI,EAAE,KAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sCAAY,GAAZ,UAAa,MAAc;QACzB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,yCAAe,GAAf;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,uDAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,sCAAY,GAAZ,UAAa,KAAa;QAA1B,iBAYC;QAXC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;aACrC,SAAS,CAAC;YACT,EAAE,CAAC,CAAC,KAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC3C,KAAI,CAAC,SAAS,GAAG,IAAI,uDAAM,CAAC,IAAI,EAAE,KAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,KAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,EAAE,UAAC,KAAK;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IAEP,CAAC;IAEH,sBAAC;AAAD,CAAC;AA5EU;IAAR,mFAAK,EAAE;;+CAAgB;AACf;IAAR,mFAAK,EAAE;kDAAY,6DAAS,oBAAT,6DAAS;kDAAQ;AAH1B,eAAe;IAL3B,wFAAS,CAAC;QACT,QAAQ,EAAE,YAAY;QACtB,kCAAsC;QACtC,kCAAqC;KACtC,CAAC;yDASiC,kEAAW,oBAAX,kEAAW;GARjC,eAAe,CA8E3B;AA9E2B;;;;;;;;;;ACX5B;AAAA,mFAAmF;AACnF,8FAA8F;AAC9F,yEAAyE;AACzE,gFAAgF;AAEhF,mFALmF;AAK5E,IAAM,WAAW,GAAG;IACzB,UAAU,EAAE,KAAK;CAClB,CAAC","file":"main.bundle.js","sourcesContent":["exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".custom-close {\\r\\n float:right;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.css\n// module id = 144\n// module chunks = 1","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \"\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-detail/book-detail.component.css\n// module id = 145\n// module chunks = 1","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".custom-close {\\r\\n float:right;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-list/book-list.component.css\n// module id = 146\n// module chunks = 1","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \"div.progress {\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.rating:hover {\\r\\n border: solid blue;\\r\\n}\\r\\n\\r\\n.selected {\\r\\n border: solid blue;\\r\\n}\\r\\n\", \"\"]);\n\n// exports\n\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = module.exports.toString();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/rating/rating.component.css\n// module id = 147\n// module chunks = 1","module.exports = \"\\r\\n\\r\\n\\r\\n
\\r\\n
Book Rater App
\\r\\n
Anyone can view the books.
\\r\\n
Users can view and create ratings
\\r\\n
Admins can do anything!
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/app.component.html\n// module id = 149\n// module chunks = 1","module.exports = \"\\r\\n
\\r\\n
\\r\\n
Title: {{selectedBook.title}}
\\r\\n
Author: {{selectedBook.author}}
\\r\\n
A quick summary of the book
\\r\\n
\\r\\n
\\r\\n
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-detail/book-detail.component.html\n// module id = 150\n// module chunks = 1","module.exports = \"\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Title: {{book.title}}
\\r\\n Author: {{book.author}}
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Add New Book
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/book/book-list/book-list.component.html\n// module id = 151\n// module chunks = 1","module.exports = \"Ratings:\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/app/rating/rating.component.html\n// module id = 152\n// module chunks = 1","import {Injectable} from \"@angular/core\";\r\nimport {Observable} from \"rxjs\";\r\nimport {Response, Http, Headers, RequestOptions} from \"@angular/http\";\r\nimport {Book} from \"./book\";\r\nimport {Rating} from \"./rating\";\r\n\r\n@Injectable()\r\nexport class HttpService {\r\n\r\n constructor(private http: Http) { }\r\n\r\n me(): Observable {\r\n return this.http.get(\"/me\", this.makeOptions())\r\n }\r\n\r\n logout(): Observable {\r\n return this.http.post(\"/logout\", '', this.makeOptions())\r\n }\r\n\r\n getBooks(): Observable {\r\n return this.http.get(\"/book-service/books\", this.makeOptions())\r\n }\r\n\r\n updateBook(newBook: Book): Observable {\r\n return this.http.put(\"/book-service/books/\" + newBook.id, newBook, this.makeOptions())\r\n }\r\n\r\n deleteBook(book: Book): Observable {\r\n return this.http.delete(\"/book-service/books/\" + book.id, this.makeOptions())\r\n }\r\n\r\n createBook(newBook: Book): Observable {\r\n return this.http.post(\"/book-service/books\", newBook, this.makeOptions())\r\n }\r\n\r\n getRatings(bookId: number): Observable {\r\n return this.http.get(\"/rating-service/ratings?bookId=\" + bookId, this.makeOptions())\r\n }\r\n\r\n createRating(rating: Rating): Observable {\r\n return this.http.post(\"/rating-service/ratings\", rating, this.makeOptions())\r\n }\r\n\r\n deleteRating(ratingId: number) {\r\n return this.http.delete(\"/rating-service/ratings/\" + ratingId, this.makeOptions())\r\n }\r\n\r\n updateRating(rating: Rating) {\r\n return this.http.put(\"/rating-service/ratings/\" + rating.id, rating, this.makeOptions())\r\n }\r\n\r\n private makeOptions(): RequestOptions {\r\n let headers = new Headers({'Content-Type': 'application/json'});\r\n return new RequestOptions({headers: headers});\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/http.service.ts","export class Principal {\r\n public authenticated: boolean;\r\n public authorities: Authority[] = [];\r\n\r\n constructor(authenticated: boolean, authorities: any[]) {\r\n this.authenticated = authenticated;\r\n authorities.map(auth => this.authorities.push(new Authority(auth.authority)))\r\n }\r\n\r\n isAdmin() {\r\n return this.authorities.some((auth: Authority) => auth.authority.indexOf('ADMIN') > -1)\r\n }\r\n}\r\n\r\nexport class Authority {\r\n public authority: String;\r\n\r\n constructor(authority: String) {\r\n this.authority = authority;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/principal.ts","export class Book {\r\n id: number;\r\n author: String;\r\n title: String;\r\n constructor(id: number, author: String, title: String){\r\n this.id = id;\r\n this.author = author;\r\n this.title = title;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book.ts","function webpackEmptyContext(req) {\n\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 74;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src async\n// module id = 74\n// module chunks = 1","import {enableProdMode} from \"@angular/core\";\r\nimport {platformBrowserDynamic} from \"@angular/platform-browser-dynamic\";\r\nimport {AppModule} from \"./app/app.module\";\r\nimport {environment} from \"./environments/environment\";\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule);\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.ts","import {Component} from \"@angular/core\";\r\nimport {Principal} from \"./principal\";\r\nimport {Response} from \"@angular/http\";\r\nimport {Book} from \"./book\";\r\nimport {HttpService} from \"./http.service\";\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent {\r\n selectedBook: Book = null;\r\n principal: Principal = new Principal(false, []);\r\n loginFailed: boolean = false;\r\n\r\n constructor(private httpService: HttpService){}\r\n\r\n ngOnInit(): void {\r\n this.httpService.me()\r\n .subscribe((response: Response) => {\r\n let principalJson = response.json();\r\n this.principal = new Principal(principalJson.authenticated, principalJson.authorities);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n onLogout() {\r\n this.httpService.logout()\r\n .subscribe((response: Response) => {\r\n if (response.status === 200) {\r\n this.loginFailed = false;\r\n this.principal = new Principal(false, []);\r\n window.location.replace(response.url);\r\n }\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n closeBookDetail() {\r\n this.selectedBook = null;\r\n }\r\n\r\n selectBook(book: Book) {\r\n this.selectedBook = book;\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.component.ts","import {BrowserModule} from \"@angular/platform-browser\";\r\nimport {NgModule} from \"@angular/core\";\r\nimport {FormsModule} from \"@angular/forms\";\r\nimport {HttpModule} from \"@angular/http\";\r\nimport {AppComponent} from \"./app.component\";\r\nimport {RatingComponent} from \"./rating/rating.component\";\r\nimport {ClickStopPropagationDirective} from \"./click-stop-propagation.directive\";\r\nimport {BookDetailComponent} from \"./book/book-detail/book-detail.component\";\r\nimport {BookListComponent} from \"./book/book-list/book-list.component\";\r\nimport {HttpService} from \"./http.service\";\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n RatingComponent,\r\n ClickStopPropagationDirective,\r\n BookDetailComponent,\r\n BookListComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n FormsModule,\r\n HttpModule\r\n ],\r\n providers: [HttpService],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/app.module.ts","import {Component, OnInit, Input, Output, EventEmitter} from \"@angular/core\";\r\nimport {Book} from \"../../book\";\r\nimport {Principal} from \"../../principal\";\r\n\r\n@Component({\r\n selector: 'app-book-detail',\r\n templateUrl: './book-detail.component.html',\r\n styleUrls: ['./book-detail.component.css']\r\n})\r\nexport class BookDetailComponent implements OnInit {\r\n\r\n @Input() selectedBook: Book = null;\r\n @Input() principal: Principal = null;\r\n @Output() closeBook: EventEmitter = new EventEmitter();\r\n\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n closeBookDetail() {\r\n this.closeBook.emit(null);\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book/book-detail/book-detail.component.ts","import {Component, OnInit, Input, Output, EventEmitter} from \"@angular/core\";\r\nimport {Principal} from \"../../principal\";\r\nimport {Book} from \"../../book\";\r\nimport {Response} from \"@angular/http\";\r\nimport {HttpService} from \"../../http.service\";\r\n\r\n@Component({\r\n selector: 'app-book-list',\r\n templateUrl: './book-list.component.html',\r\n styleUrls: ['./book-list.component.css']\r\n})\r\nexport class BookListComponent implements OnInit {\r\n\r\n @Input() principal: Principal = null;\r\n @Output() onBookSelected: EventEmitter = new EventEmitter();\r\n\r\n books: Book[] = [];\r\n newBooks: Book[] = [];\r\n newBook: Book = new Book(Math.floor(Math.random() * 1000), '', '');\r\n booksToEdit: number[] = [];\r\n isAddNewBook: boolean = false;\r\n selectedBook: Book = null;\r\n\r\n constructor(private httpService: HttpService) { }\r\n\r\n ngOnInit() {\r\n this.loadBooks();\r\n }\r\n\r\n loadBooks() {\r\n this.httpService.getBooks()\r\n .subscribe((response: Response) => {\r\n let booksJson: any[] = response.json()\r\n booksJson.forEach(book => {\r\n this.books.push(new Book(book.id, book.author, book.title));\r\n this.newBooks.push(new Book(book.id, book.author, book.title));\r\n })\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n cancelEditBook(bookIndex: number) {\r\n if (this.booksToEdit.indexOf(bookIndex) !== -1) {\r\n this.booksToEdit.splice(this.booksToEdit.indexOf(bookIndex), 1); //remove the index of the book to edit\r\n //get the original book\r\n let bookCopy: Book = new Book(this.books[bookIndex].id, this.books[bookIndex].author, this.books[bookIndex].title);\r\n this.newBooks.splice(bookIndex,1,bookCopy); //replace the edited book with the old book\r\n }\r\n }\r\n\r\n editBook(bookIndex: number) {\r\n this.booksToEdit.push(bookIndex);\r\n }\r\n\r\n saveBook(bookIndex: number, newBook: Book) {\r\n console.log(newBook);\r\n //save the book to the database\r\n this.httpService.updateBook(newBook)\r\n .subscribe((response: Response) => {\r\n let bookJson = response.json();\r\n let book: Book = new Book(bookJson.id, bookJson.author, bookJson.title);\r\n //update the current array of books\r\n let bookArr: Book = this.books.find(b => b.id === book.id);\r\n bookArr.title = book.title;\r\n bookArr.author = book.author;\r\n this.booksToEdit.splice(this.booksToEdit.indexOf(bookIndex), 1); //remove the index of the book to edit\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n\r\n\r\n }\r\n\r\n delete(bookIndex: number) {\r\n let book: Book = this.books[bookIndex];\r\n this.httpService.deleteBook(book)\r\n .subscribe(() => {\r\n if (this.selectedBook !== null && this.books[bookIndex].id === this.selectedBook.id) {\r\n this.selectedBook = null;\r\n this.onBookSelected.emit(this.selectedBook);\r\n }\r\n\r\n this.books.splice(bookIndex, 1); //remove the book at this index;\r\n this.newBooks.splice(bookIndex, 1); //remove the editing book at this index\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n activateAddNewBook() {\r\n this.isAddNewBook = true;\r\n this.newBook = new Book(null, '', '');\r\n }\r\n\r\n addNewBook(newBook: Book, element: any) {\r\n //write new book to db\r\n this.httpService.createBook(newBook)\r\n .subscribe((response: Response) => {\r\n let bookJson = response.json();\r\n let book: Book = new Book(bookJson.id, bookJson.author, bookJson.title);\r\n console.log(book);\r\n this.books.push(book);\r\n this.newBooks.push(book);\r\n this.newBook = new Book(Math.floor(Math.random() * 1000), '', '');\r\n element.focus();\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n cancelAddBook() {\r\n this.isAddNewBook = false;\r\n }\r\n\r\n\r\n selectBook(book: Book) {\r\n this.selectedBook = book;\r\n this.onBookSelected.emit(book);\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/book/book-list/book-list.component.ts","import {Directive, HostListener} from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[appClickStopPropagation]'\r\n})\r\nexport class ClickStopPropagationDirective\r\n{\r\n @HostListener(\"click\", [\"$event\"])\r\n public onClick(event: any): void\r\n {\r\n event.stopPropagation();\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/click-stop-propagation.directive.ts","export class Rating{\r\n id: number;\r\n bookId: number;\r\n stars: number;\r\n\r\n constructor(id: number, bookId: number, stars: number) {\r\n this.id = id;\r\n this.bookId = bookId;\r\n this.stars = stars;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/rating.ts","import {Component, OnInit, Input, OnChanges} from \"@angular/core\";\r\nimport {Rating} from \"../rating\";\r\nimport {Principal} from \"../principal\";\r\nimport {HttpService} from \"../http.service\";\r\nimport {Response} from \"@angular/http\";\r\n\r\n@Component({\r\n selector: 'app-rating',\r\n templateUrl: './rating.component.html',\r\n styleUrls: ['./rating.component.css']\r\n})\r\nexport class RatingComponent implements OnInit, OnChanges {\r\n\r\n @Input() bookId: number;\r\n @Input() principal: Principal = null;\r\n ratings: Rating[] = [];\r\n stars: number[] = [1,2,3,4,5];\r\n newRating: Rating = null;\r\n\r\n constructor(private httpService: HttpService) { }\r\n\r\n ngOnInit() {}\r\n\r\n ngOnChanges() {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n this.ratings = [];\r\n this.loadRatings();\r\n }\r\n\r\n findWidth(rating: Rating): String {\r\n let percent: number = (rating.stars/5)*100;\r\n return percent.toString() + '%';\r\n }\r\n\r\n private loadRatings() {\r\n this.httpService.getRatings(this.bookId)\r\n .subscribe((response: Response) => {\r\n let responseJson: any[] = response.json();\r\n responseJson.forEach(rating => this.ratings.push(new Rating(rating.id, rating.bookId, rating.stars)))\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n onSaveRating() {\r\n console.log(this.newRating);\r\n let ratingCopy: Rating = Object.assign({}, this.newRating);\r\n this.httpService.createRating(ratingCopy)\r\n .subscribe((response: Response) => {\r\n let ratingJson = response.json()\r\n this.ratings.push(new Rating(ratingJson.id, ratingJson.bookId, ratingJson.stars))\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n updateRating() {\r\n this.httpService.updateRating(this.newRating)\r\n .subscribe(() => {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n }\r\n\r\n selectRating(rating: Rating) {\r\n if (this.principal.isAdmin()) {\r\n this.newRating = rating;\r\n }\r\n }\r\n\r\n cancelSelection() {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }\r\n\r\n deleteRating(index: number) {\r\n let rating = this.ratings[index];\r\n this.httpService.deleteRating(rating.id)\r\n .subscribe(() => {\r\n if (this.ratings[index] === this.newRating) {\r\n this.newRating = new Rating(null, this.bookId, 1);\r\n }\r\n this.ratings.splice(index, 1);\r\n }, (error) => {\r\n console.log(error);\r\n });\r\n\r\n }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/app/rating/rating.component.ts","// The file contents for the current environment will overwrite these during build.\r\n// The build system defaults to the dev environment which uses `environment.ts`, but if you do\r\n// `ng build --env=prod` then `environment.prod.ts` will be used instead.\r\n// The list of which env maps to which file can be found in `.angular-cli.json`.\r\n\r\nexport const environment = {\r\n production: false\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/environments/environment.ts"],"sourceRoot":""}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html
index a01609d221..845371bb7f 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html
@@ -7,6 +7,6 @@
Book Rater
So many great things about the books
-Login
+Login