diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java index bae96109f..a29206233 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/BooksService.java @@ -221,26 +221,23 @@ public class BooksService { List shelvesToUnassign = shelfRepository.findAllById(shelfIdsToUnassign); for (Book book : books) { - for (Shelf shelf : shelvesToUnassign) { - Optional shelfOpt = book.getShelves().stream().filter(s -> s.getId().equals(shelf.getId())).findAny(); - shelfOpt.ifPresent(value -> book.getShelves().remove(value)); - shelf.getBooks().remove(book); - shelfRepository.save(shelf); - } - for (Shelf shelf : shelvesToAssign) { - Optional shelfOpt = book.getShelves().stream().filter(s -> s.getId().equals(shelf.getId())).findAny(); - if (shelfOpt.isEmpty()) { + book.getShelves().removeIf(shelf -> shelfIdsToUnassign.contains(shelf.getId())); + shelvesToUnassign.forEach(shelf -> shelf.getBooks().remove(book)); + + shelvesToAssign.forEach(shelf -> { + if (!book.getShelves().contains(shelf)) { book.getShelves().add(shelf); } - Optional bookOpt = shelf.getBooks().stream().filter(b -> b.getId().equals(book.getId())).findAny(); - if (bookOpt.isEmpty()) { + if (!shelf.getBooks().contains(book)) { shelf.getBooks().add(book); } - shelfRepository.save(shelf); - } + }); + bookRepository.save(book); + shelfRepository.saveAll(shelvesToAssign); } - return books.stream().map(BookTransformer::convertToBookDTO).toList(); + + return books.stream().map(BookTransformer::convertToBookDTO).collect(Collectors.toList()); } } diff --git a/booklore-ui/src/app/book/component/books-browser/books-browser.component.html b/booklore-ui/src/app/book/component/books-browser/books-browser.component.html index 8cedb72fc..fe842d79c 100644 --- a/booklore-ui/src/app/book/component/books-browser/books-browser.component.html +++ b/booklore-ui/src/app/book/component/books-browser/books-browser.component.html @@ -12,9 +12,12 @@
- +
+ + + +
-
diff --git a/booklore-ui/src/app/book/component/books-browser/books-browser.component.scss b/booklore-ui/src/app/book/component/books-browser/books-browser.component.scss index 47b68d63e..69a0bde8d 100644 --- a/booklore-ui/src/app/book/component/books-browser/books-browser.component.scss +++ b/booklore-ui/src/app/book/component/books-browser/books-browser.component.scss @@ -55,3 +55,8 @@ display: flex; justify-content: space-around; } + +.button-container { + display: flex; + gap: 10px; /* Adds 10px space between buttons */ +} diff --git a/booklore-ui/src/app/book/component/books-browser/books-browser.component.ts b/booklore-ui/src/app/book/component/books-browser/books-browser.component.ts index 090327b1f..2e58efb03 100644 --- a/booklore-ui/src/app/book/component/books-browser/books-browser.component.ts +++ b/booklore-ui/src/app/book/component/books-browser/books-browser.component.ts @@ -25,6 +25,7 @@ export class BooksBrowserComponent implements OnInit { items: MenuItem[] | undefined; selectedBooks: Set = new Set(); book: Book | undefined; + entity: Library | Shelf | null = null; constructor( private activatedRoute: ActivatedRoute, @@ -88,6 +89,11 @@ export class BooksBrowserComponent implements OnInit { return of(null); }) ); + + this.entity$.subscribe(entity => { + this.entity = entity; // Store resolved value in local variable + }); + } handleBookSelect(book: Book, selected: boolean): void { @@ -142,4 +148,19 @@ export class BooksBrowserComponent implements OnInit { }, }); } + + unshelfBooks() { + if (this.entity) { + this.bookService.assignShelvesToBook(this.selectedBooks, new Set(), new Set([this.entity.id])).subscribe( + () => { + this.messageService.add({severity: 'info', summary: 'Success', detail: 'Book\'s shelves updated'}); + this.selectedBooks = new Set(); + }, + (error) => { + this.messageService.add({severity: 'error', summary: 'Error', detail: 'Failed to update book\'s shelves'}); + } + ); + } + } + }