diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java b/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java index 11eba6da5..778148209 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/controller/LibraryController.java @@ -11,7 +11,6 @@ import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.io.IOException; import java.util.List; diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/LibraryDTO.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/LibraryDTO.java index 145201685..24cc39237 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/LibraryDTO.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/LibraryDTO.java @@ -14,6 +14,7 @@ public class LibraryDTO { private Long id; private String name; private Sort sort; + private String icon; private List paths; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/ShelfDTO.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/ShelfDTO.java index 2809a8f72..f48adbc95 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/ShelfDTO.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/ShelfDTO.java @@ -13,5 +13,6 @@ import java.time.Instant; public class ShelfDTO { private Long id; private String name; + private String icon; private Sort sort; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/CreateLibraryRequest.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/CreateLibraryRequest.java index a0dc32c95..8be4ffc80 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/CreateLibraryRequest.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/CreateLibraryRequest.java @@ -1,6 +1,8 @@ package com.adityachandel.booklore.model.dto.request; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import lombok.Builder; import lombok.Data; @@ -10,6 +12,10 @@ import java.util.List; @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class CreateLibraryRequest { + @NotBlank private String name; + @NotBlank + private String icon; + @NotEmpty private List paths; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/ShelfCreateRequest.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/ShelfCreateRequest.java index 26317cc19..a21c35aff 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/ShelfCreateRequest.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/dto/request/ShelfCreateRequest.java @@ -12,4 +12,7 @@ public class ShelfCreateRequest { @NotBlank(message = "Shelf name must not be empty.") private String name; + + @NotBlank(message = "Shelf icon must not be empty.") + private String icon; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Library.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Library.java index 537fcdb06..a5d06ac33 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Library.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Library.java @@ -31,4 +31,6 @@ public class Library { @OneToMany(mappedBy = "library", cascade = CascadeType.ALL, orphanRemoval = true) private List books; + + private String icon; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Shelf.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Shelf.java index d42568a3a..117b3b760 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Shelf.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/entity/Shelf.java @@ -28,4 +28,6 @@ public class Shelf { @ManyToMany(mappedBy = "shelves", fetch = FetchType.LAZY) private Set books = new HashSet<>(); + + private String icon; } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/LibraryService.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/LibraryService.java index 6e668ed93..5e2ecdd0a 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/LibraryService.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/LibraryService.java @@ -29,7 +29,11 @@ public class LibraryService { private final LibraryProcessingService libraryProcessingService; public LibraryDTO createLibrary(CreateLibraryRequest request) { - Library library = Library.builder().name(request.getName()).paths(request.getPaths()).build(); + Library library = Library.builder() + .name(request.getName()) + .paths(request.getPaths()) + .icon(request.getIcon()) + .build(); library = libraryRepository.save(library); Long libraryId = library.getId(); Thread.startVirtualThread(() -> { diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/ShelfService.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/ShelfService.java index 5cf4c0803..1a8471ac5 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/ShelfService.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/ShelfService.java @@ -28,7 +28,7 @@ public class ShelfService { if (exists) { throw ApiError.SHELF_ALREADY_EXISTS.createException(request.getName()); } - Shelf shelf = Shelf.builder().name(request.getName()).build(); + Shelf shelf = Shelf.builder().icon(request.getIcon()).name(request.getName()).build(); return ShelfTransformer.convertToShelfDTO(shelfRepository.save(shelf)); } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/transformer/LibraryTransformer.java b/booklore-api/src/main/java/com/adityachandel/booklore/transformer/LibraryTransformer.java index f0de13c49..4589ddd69 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/transformer/LibraryTransformer.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/transformer/LibraryTransformer.java @@ -11,6 +11,7 @@ public class LibraryTransformer { .id(library.getId()) .name(library.getName()) .sort(library.getSort()) + .icon(library.getIcon()) .paths(library.getPaths()) .build(); } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/transformer/ShelfTransformer.java b/booklore-api/src/main/java/com/adityachandel/booklore/transformer/ShelfTransformer.java index b94dce80f..8f33adb7a 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/transformer/ShelfTransformer.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/transformer/ShelfTransformer.java @@ -10,6 +10,7 @@ public class ShelfTransformer { .id(shelf.getId()) .name(shelf.getName()) .sort(shelf.getSort()) + .icon(shelf.getIcon()) .build(); } } diff --git a/booklore-api/src/main/resources/db/migration/V1__Create_Library_and_Book_Tables.sql b/booklore-api/src/main/resources/db/migration/V1__Create_Library_and_Book_Tables.sql index b1ab5666d..011ed5183 100644 --- a/booklore-api/src/main/resources/db/migration/V1__Create_Library_and_Book_Tables.sql +++ b/booklore-api/src/main/resources/db/migration/V1__Create_Library_and_Book_Tables.sql @@ -2,8 +2,9 @@ CREATE TABLE IF NOT EXISTS library ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) UNIQUE NOT NULL, - paths TEXT, - sort VARCHAR(255) NULL + sort VARCHAR(255) NULL, + icon VARCHAR(64) NOT NULL, + paths TEXT ); CREATE TABLE IF NOT EXISTS book @@ -85,7 +86,8 @@ CREATE TABLE IF NOT EXISTS shelf ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, - sort VARCHAR(255) NULL + sort VARCHAR(255) NULL, + icon VARCHAR(64) NOT NULL ); CREATE TABLE IF NOT EXISTS book_shelf_mapping diff --git a/booklore-api/src/main/resources/db/migration/V2__Insert_Initial_Data.sql b/booklore-api/src/main/resources/db/migration/V2__Insert_Initial_Data.sql index 93b46e9cf..d6422facf 100644 --- a/booklore-api/src/main/resources/db/migration/V2__Insert_Initial_Data.sql +++ b/booklore-api/src/main/resources/db/migration/V2__Insert_Initial_Data.sql @@ -1,2 +1 @@ -INSERT INTO booklore.shelf (name) VALUES ('Favorites'); -INSERT INTO booklore.shelf (name) VALUES ('Read Later'); \ No newline at end of file +INSERT INTO booklore.shelf (name, icon) VALUES ('Favorites', 'heart'); \ No newline at end of file diff --git a/booklore-ui/src/app/app.module.ts b/booklore-ui/src/app/app.module.ts index 7584cfc48..b9e2ab03d 100644 --- a/booklore-ui/src/app/app.module.ts +++ b/booklore-ui/src/app/app.module.ts @@ -36,6 +36,7 @@ import {SpeedDialModule} from 'primeng/speeddial'; import {RouteReuseStrategy} from '@angular/router'; import {CustomReuseStrategy} from './custom-reuse-strategy'; import {MenuModule} from 'primeng/menu'; +import {IconPickerComponent} from './book/component/icon-picker/icon-picker.component'; @NgModule({ declarations: [ @@ -71,6 +72,7 @@ import {MenuModule} from 'primeng/menu'; BookCardComponent, SpeedDialModule, MenuModule, + IconPickerComponent, ], providers: [ DialogService, diff --git a/booklore-ui/src/app/book/component/dashboard/dashboard.component.html b/booklore-ui/src/app/book/component/dashboard/dashboard.component.html index 07436f9e5..e08879631 100644 --- a/booklore-ui/src/app/book/component/dashboard/dashboard.component.html +++ b/booklore-ui/src/app/book/component/dashboard/dashboard.component.html @@ -8,7 +8,7 @@ label="Add a Library" icon="pi pi-plus" styleClass="p-button-rounded p-button-outlined" - (click)="createNewLibrary($event)"> + (click)="createNewLibrary()"> diff --git a/booklore-ui/src/app/book/component/dashboard/dashboard.component.ts b/booklore-ui/src/app/book/component/dashboard/dashboard.component.ts index eef7d7f9b..4d27662d7 100644 --- a/booklore-ui/src/app/book/component/dashboard/dashboard.component.ts +++ b/booklore-ui/src/app/book/component/dashboard/dashboard.component.ts @@ -1,5 +1,5 @@ import {Component} from '@angular/core'; -import {Button, ButtonDirective} from 'primeng/button'; +import {Button} from 'primeng/button'; import {AsyncPipe, NgIf} from '@angular/common'; import {LibraryCreatorComponent} from '../library-creator/library-creator.component'; import {DialogService, DynamicDialogRef} from 'primeng/dynamicdialog'; @@ -7,7 +7,6 @@ import {DashboardScrollerComponent} from '../dashboard-scroller/dashboard-scroll import {LibraryService} from '../../service/library.service'; import {Observable} from 'rxjs'; import {map} from 'rxjs/operators'; -import {IconPickerComponent} from '../icon-picker/icon-picker.component'; @Component({ selector: 'app-home-page', @@ -17,8 +16,7 @@ import {IconPickerComponent} from '../icon-picker/icon-picker.component'; Button, NgIf, DashboardScrollerComponent, - AsyncPipe, - IconPickerComponent + AsyncPipe ], providers: [DialogService], }) @@ -32,21 +30,13 @@ export class DashboardComponent { ); } - createNewLibrary(event: MouseEvent) { - const buttonRect = (event.target as HTMLElement).getBoundingClientRect(); - const dialogWidthPercentage = 50; - const viewportWidth = window.innerWidth; - const dialogWidth = (dialogWidthPercentage / 100) * viewportWidth; - const leftPosition = buttonRect.left + (buttonRect.width / 2) - (dialogWidth / 2); + createNewLibrary() { this.ref = this.dialogService.open(LibraryCreatorComponent, { + header: 'Create New Library', modal: true, - width: `${dialogWidthPercentage}%`, - height: 'auto', - style: { - position: 'absolute', - top: `${buttonRect.bottom + 10}px`, - left: `${Math.max(leftPosition, 0)}px` - }, + width: '50%', + height: '50%', + style: {bottom: '15%'} }); } } diff --git a/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.scss b/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.scss index 85189ea3c..1e7731398 100644 --- a/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.scss +++ b/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.scss @@ -9,7 +9,6 @@ justify-content: center; align-items: center; cursor: pointer; - font-size: 36px; } .icon-search { diff --git a/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.ts b/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.ts index 42951a7ed..2fccef5a5 100644 --- a/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.ts +++ b/booklore-ui/src/app/book/component/icon-picker/icon-picker.component.ts @@ -1,4 +1,4 @@ -import {Component} from '@angular/core'; +import {Component, EventEmitter, Output} from '@angular/core'; import {DialogModule} from 'primeng/dialog'; import {NgForOf} from '@angular/common'; import {FormsModule} from '@angular/forms'; @@ -14,10 +14,9 @@ import {FormsModule} from '@angular/forms'; ], }) export class IconPickerComponent { - iconDialogVisible: boolean = true; + iconDialogVisible: boolean = false; selectedIcon: string | null = null; searchText: string = ''; - iconCategories: string[] = [ "address-book", "align-center", "align-justify", "align-left", "align-right", "android", "angle-double-down", "angle-double-left", "angle-double-right", "angle-double-up", "angle-down", "angle-left", @@ -53,6 +52,8 @@ export class IconPickerComponent { icons: string[] = this.createIconList(this.iconCategories); + @Output() iconSelected = new EventEmitter(); + createIconList(categories: string[]): string[] { return categories.map(iconName => `pi pi-${iconName}`); } @@ -64,14 +65,14 @@ export class IconPickerComponent { return this.icons.filter(icon => icon.toLowerCase().includes(this.searchText.toLowerCase())); } - openIconDialog() { + open() { this.iconDialogVisible = true; } selectIcon(icon: string) { this.selectedIcon = icon; this.iconDialogVisible = false; - console.log('Selected Icon:', icon); + this.iconSelected.emit(icon); } } diff --git a/booklore-ui/src/app/book/component/layout/app.menu.component.ts b/booklore-ui/src/app/book/component/layout/app.menu.component.ts index 63c24db6a..2d5fca183 100644 --- a/booklore-ui/src/app/book/component/layout/app.menu.component.ts +++ b/booklore-ui/src/app/book/component/layout/app.menu.component.ts @@ -28,7 +28,7 @@ export class AppMenuComponent implements OnInit { separator: false, items: libraries.map((library) => ({ label: library.name, - icon: 'pi pi-fw pi-book', + icon: 'pi pi-' + library.icon, routerLink: [`/library/${library.id}/books`], })), }, @@ -42,7 +42,7 @@ export class AppMenuComponent implements OnInit { separator: false, items: shelves.map((shelf) => ({ label: shelf.name, - icon: 'pi pi-fw pi-heart', + icon: 'pi pi-' + shelf.icon, routerLink: [`/shelf/${shelf.id}/books`], })), }, diff --git a/booklore-ui/src/app/book/component/layout/app.topbar.component.ts b/booklore-ui/src/app/book/component/layout/app.topbar.component.ts index 61d568fc7..290782e66 100644 --- a/booklore-ui/src/app/book/component/layout/app.topbar.component.ts +++ b/booklore-ui/src/app/book/component/layout/app.topbar.component.ts @@ -40,7 +40,7 @@ export class AppTopBarComponent implements OnDestroy { this.ref = this.dialogService.open(LibraryCreatorComponent, { header: 'Create New Library', modal: true, - width: '50%', + width: '40%', height: '50%', style: {bottom: '15%'} }); diff --git a/booklore-ui/src/app/book/component/library-creator/library-creator.component.html b/booklore-ui/src/app/book/component/library-creator/library-creator.component.html index 9522179b4..1e56a7772 100644 --- a/booklore-ui/src/app/book/component/library-creator/library-creator.component.html +++ b/booklore-ui/src/app/book/component/library-creator/library-creator.component.html @@ -2,27 +2,35 @@
-
- +
+ +
+
+
Library Name:
+ +
+
+
Library Icon:
+
+ +
+
+ + +
+
+
+
- +
-
+
diff --git a/booklore-ui/src/app/book/component/library-creator/library-creator.component.scss b/booklore-ui/src/app/book/component/library-creator/library-creator.component.scss index 35327d352..a0115427d 100644 --- a/booklore-ui/src/app/book/component/library-creator/library-creator.component.scss +++ b/booklore-ui/src/app/book/component/library-creator/library-creator.component.scss @@ -1,26 +1,51 @@ -.container { +.library-name-icon-parent { display: flex; flex-direction: column; - justify-content: center; + align-items: flex-start; + gap: 1rem; +} + +.library-name-div { + display: flex; align-items: center; - position: relative; - height: 100%; + gap: 0.5rem; } -.textbox { - padding: 10px; - margin-bottom: 20px; +.library-icon-div { + display: flex; + align-items: center; + gap: 0.5rem; } -.button { - position: absolute; - bottom: 10px; - left: 10px; +.library-name-div label, +.library-icon-div label { + margin-right: 0.5rem; } -.tr-custom { - padding: 0.25rem 0.5rem !important; - border: 0px !important; +.library-name-div input { + width: 200px; +} + +.library-icon-div p-button { + margin-left: 0.8rem; +} + +.p-stepperPanel { + display: flex; + flex-direction: column; + padding: 1rem; +} + +.p-stepperPanel .flex { + display: flex; +} + +.p-stepperPanel .justify-content-end { + justify-content: flex-end; +} + +.p-stepperPanel .mt-3 { + margin-top: 1rem; } .p-table-custom { @@ -30,15 +55,37 @@ overflow: scroll; } -.td-x-custom { - text-align: right; +.tr-custom { + padding: 0.25rem 0.5rem !important; + border: 0px !important; } -.mt-3 { - margin-top: 1rem; +.td-x-custom { + text-align: right; } .w-100 { width: 100%; } +.p-button { + margin-left: 0.5rem; +} + +.selected-icon-container { + display: flex; + align-items: center; + margin-left: 1rem; + + i { + color: var(--text-color); + } + + .remove-icon-button { + margin-left: 0.5rem; + } +} + +.xxx { + min-height: 295px; +} diff --git a/booklore-ui/src/app/book/component/library-creator/library-creator.component.ts b/booklore-ui/src/app/book/component/library-creator/library-creator.component.ts index e3015fdbe..5eff9dcd0 100644 --- a/booklore-ui/src/app/book/component/library-creator/library-creator.component.ts +++ b/booklore-ui/src/app/book/component/library-creator/library-creator.component.ts @@ -1,9 +1,10 @@ -import {Component} from '@angular/core'; +import {Component, ViewChild} from '@angular/core'; import {DialogService, DynamicDialogRef} from 'primeng/dynamicdialog'; import {DirectoryPickerComponent} from '../directory-picker/directory-picker.component'; import {MessageService} from 'primeng/api'; import {Router} from '@angular/router'; import {LibraryService} from '../../service/library.service'; +import {IconPickerComponent} from '../icon-picker/icon-picker.component'; @Component({ selector: 'app-library-creator', @@ -16,13 +17,15 @@ export class LibraryCreatorComponent { value: string = ''; folders: string[] = []; ref: DynamicDialogRef | undefined; + @ViewChild(IconPickerComponent) iconPicker: IconPickerComponent | undefined; + + selectedIcon: string | null = null; constructor( private dialogService: DialogService, private dynamicDialogRef: DynamicDialogRef, private libraryService: LibraryService, - private router: Router, - ) { + private router: Router) { } show() { @@ -50,10 +53,25 @@ export class LibraryCreatorComponent { this.folders.splice(index, 1); } + openIconPicker() { + if (this.iconPicker) { + this.iconPicker.open(); + } + } + + onIconSelected(icon: string) { + this.selectedIcon = icon; + } + + clearSelectedIcon() { + this.selectedIcon = null; + } + addLibrary() { const newLibrary = { name: this.value, paths: this.folders, + icon: this.selectedIcon ? this.selectedIcon.replace('pi pi-', '') : 'heart' }; this.libraryService.createLibrary(newLibrary).subscribe({ next: (createdLibrary) => { @@ -93,4 +111,5 @@ export class LibraryCreatorComponent { ); } }*/ + } diff --git a/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.html b/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.html index 0b48a8c07..29b36e9c8 100644 --- a/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.html +++ b/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.html @@ -1,7 +1,7 @@
- +
@@ -17,13 +17,23 @@
- - + +
+
+ +
+ +
+
+ + +
+
diff --git a/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.ts b/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.ts index e5822aacc..11d0140f7 100644 --- a/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.ts +++ b/booklore-ui/src/app/book/component/shelf-assigner/shelf-assigner.component.ts @@ -1,4 +1,4 @@ -import {Component, OnInit} from '@angular/core'; +import {Component, OnInit, ViewChild} from '@angular/core'; import {DynamicDialogConfig, DynamicDialogRef} from 'primeng/dynamicdialog'; import {Book} from '../../model/book.model'; import {MessageService} from 'primeng/api'; @@ -7,6 +7,7 @@ import {Observable} from 'rxjs'; import {BookService} from '../../service/book.service'; import {map, tap} from 'rxjs/operators'; import {Shelf} from '../../model/shelf.model'; +import {IconPickerComponent} from '../icon-picker/icon-picker.component'; @Component({ selector: 'app-shelf-assigner', @@ -22,6 +23,8 @@ export class ShelfAssignerComponent implements OnInit { shelfName: string = ''; bookIds: Set = new Set(); isMultiBooks: boolean = false; + selectedIcon: string | null = null; + @ViewChild(IconPickerComponent) iconPicker: IconPickerComponent | undefined; constructor( private shelfService: ShelfService, @@ -46,7 +49,11 @@ export class ShelfAssignerComponent implements OnInit { } saveNewShelf(): void { - this.shelfService.createShelf(this.shelfName).subscribe( + const newShelf = { + name: this.shelfName, + icon: this.selectedIcon ? this.selectedIcon.replace('pi pi-', '') : 'heart' + }; + this.shelfService.createShelf(newShelf).subscribe( () => { this.messageService.add({severity: 'info', summary: 'Success', detail: 'Shelf created: ' + this.shelfName}); this.displayShelfDialog = false; @@ -99,4 +106,19 @@ export class ShelfAssignerComponent implements OnInit { closeDialog(): void { this.dynamicDialogRef.close(); } + + openIconPicker() { + if (this.iconPicker) { + this.iconPicker.open(); + } + } + + clearSelectedIcon() { + this.selectedIcon = null; + } + + onIconSelected(icon: string) { + this.selectedIcon = icon; + } + } diff --git a/booklore-ui/src/app/book/model/library.model.ts b/booklore-ui/src/app/book/model/library.model.ts index bd1810caf..382c8dd2e 100644 --- a/booklore-ui/src/app/book/model/library.model.ts +++ b/booklore-ui/src/app/book/model/library.model.ts @@ -3,6 +3,7 @@ import {SortOption} from './sort.model'; export interface Library { id?: number; name: string; + icon: string; sort?: SortOption; paths: string[]; } diff --git a/booklore-ui/src/app/book/model/shelf.model.ts b/booklore-ui/src/app/book/model/shelf.model.ts index 8b284f860..2c0e914fa 100644 --- a/booklore-ui/src/app/book/model/shelf.model.ts +++ b/booklore-ui/src/app/book/model/shelf.model.ts @@ -3,5 +3,6 @@ import {SortOption} from './sort.model'; export interface Shelf { id?: number; name: string; + icon: string; sort?: SortOption; } diff --git a/booklore-ui/src/app/book/service/shelf.service.ts b/booklore-ui/src/app/book/service/shelf.service.ts index 8d65459b5..a9eb24e1a 100644 --- a/booklore-ui/src/app/book/service/shelf.service.ts +++ b/booklore-ui/src/app/book/service/shelf.service.ts @@ -25,8 +25,8 @@ export class ShelfService { }); } - createShelf(name: string): Observable { - return this.http.post(this.url, {name}).pipe( + createShelf(shelf: Shelf): Observable { + return this.http.post(this.url, shelf).pipe( map(newShelf => { this.shelves.next([...this.shelves.value, newShelf]) return newShelf; @@ -56,14 +56,14 @@ export class ShelfService { deleteShelf(shelfId: number) { return this.http.delete(`${this.url}/${shelfId}`).pipe( - tap(() => { - this.bookService.removeBooksByLibraryId(shelfId); - let shelves = this.shelves.value.filter(shelf => shelf.id !== shelfId); - this.shelves.next(shelves); - }), - catchError(error => { - return of(); - }) + tap(() => { + this.bookService.removeBooksByLibraryId(shelfId); + let shelves = this.shelves.value.filter(shelf => shelf.id !== shelfId); + this.shelves.next(shelves); + }), + catchError(error => { + return of(); + }) ); } }