diff --git a/src/app/_models/library.ts b/src/app/_models/library.ts index 19fa61c19..a56f2c122 100644 --- a/src/app/_models/library.ts +++ b/src/app/_models/library.ts @@ -1,4 +1,5 @@ export interface Library { + id: number; name: string; coverImage: string; type: any; diff --git a/src/app/_models/series.ts b/src/app/_models/series.ts new file mode 100644 index 000000000..b54ebf135 --- /dev/null +++ b/src/app/_models/series.ts @@ -0,0 +1,10 @@ +import { Volume } from './volume'; + +export interface Series { + id: number; + name: string; + originalName: string; + sortName: string; + summary: string; + volumes: Volume[]; +} diff --git a/src/app/_models/volume.ts b/src/app/_models/volume.ts new file mode 100644 index 000000000..35f390d4d --- /dev/null +++ b/src/app/_models/volume.ts @@ -0,0 +1,5 @@ +export interface Volume { + id: number; + number: string; + files: Array; // In future, we can refactor this to be a type with extra metadata around it +} \ No newline at end of file diff --git a/src/app/_services/library.service.ts b/src/app/_services/library.service.ts index 49399a650..5243bf517 100644 --- a/src/app/_services/library.service.ts +++ b/src/app/_services/library.service.ts @@ -26,12 +26,13 @@ export class LibraryService { } getLibrariesForMember(username: string) { - return this.httpClient.get(this.baseUrl + 'library/' + username); + return this.httpClient.get(this.baseUrl + 'library/libraries-for?username=' + username); } updateLibrariesForMember(username: string, selectedLibraries: Library[]) { - return this.httpClient.post(this.baseUrl + '/library/update-for', {username, selectedLibraries}); + return this.httpClient.post(this.baseUrl + 'library/update-for', {username, selectedLibraries}); } + } diff --git a/src/app/_services/series.service.ts b/src/app/_services/series.service.ts new file mode 100644 index 000000000..4ffd75f2a --- /dev/null +++ b/src/app/_services/series.service.ts @@ -0,0 +1,18 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Series } from '../_models/series'; + +@Injectable({ + providedIn: 'root' +}) +export class SeriesService { + + baseUrl = environment.apiUrl; + + constructor(private httpClient: HttpClient) { } + + getSeries(libraryId: number) { + return this.httpClient.get(this.baseUrl + 'library/series?libraryId=' + libraryId); + } +} diff --git a/src/app/admin/manage-users/manage-users.component.html b/src/app/admin/manage-users/manage-users.component.html index 678bac385..f247ba2a2 100644 --- a/src/app/admin/manage-users/manage-users.component.html +++ b/src/app/admin/manage-users/manage-users.component.html @@ -13,7 +13,6 @@ {{member.username | titlecase}} Admin
-
diff --git a/src/app/admin/manage-users/manage-users.component.ts b/src/app/admin/manage-users/manage-users.component.ts index 07008a465..4cfa0eb19 100644 --- a/src/app/admin/manage-users/manage-users.component.ts +++ b/src/app/admin/manage-users/manage-users.component.ts @@ -61,11 +61,8 @@ export class ManageUsersComponent implements OnInit { }); } - openChangeRole(member: Member) { - - } - deleteUser(member: Member) { + // TODO: Use a modal for this confirm if (confirm('Are you sure you want to delete this user?')) { this.memberService.deleteMember(member.username).subscribe(() => { this.loadMembers(); diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index e23518db7..c0d3127d9 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,8 +1,8 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home/home.component'; +import { LibraryDetailComponent } from './library-detail/library-detail.component'; import { LibraryComponent } from './library/library.component'; -import { AdminGuard } from './_guards/admin.guard'; const routes: Routes = [ {path: '', component: HomeComponent}, @@ -11,6 +11,7 @@ const routes: Routes = [ loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) }, {path: 'library', component: LibraryComponent}, + {path: 'library/:id', component: LibraryDetailComponent}, {path: '**', component: HomeComponent, pathMatch: 'full'} ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 14b772fe4..41ce34cad 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -15,6 +15,8 @@ import { ToastrModule } from 'ngx-toastr'; import { ErrorInterceptor } from './_interceptors/error.interceptor'; import { LibraryComponent } from './library/library.component'; import { SharedModule } from './shared/shared.module'; +import { LibraryDetailComponent } from './library-detail/library-detail.component'; +import { SeriesDetailComponent } from './series-detail/series-detail.component'; @@ -25,6 +27,8 @@ import { SharedModule } from './shared/shared.module'; NavHeaderComponent, UserLoginComponent, LibraryComponent, + LibraryDetailComponent, + SeriesDetailComponent, ], imports: [ HttpClientModule, diff --git a/src/app/library-detail/library-detail.component.html b/src/app/library-detail/library-detail.component.html new file mode 100644 index 000000000..dfb0e8e41 --- /dev/null +++ b/src/app/library-detail/library-detail.component.html @@ -0,0 +1,6 @@ +

Title (Manga/Recently Added)

+
+
+ +
+
\ No newline at end of file diff --git a/src/app/library-detail/library-detail.component.scss b/src/app/library-detail/library-detail.component.scss new file mode 100644 index 000000000..7f7daffd5 --- /dev/null +++ b/src/app/library-detail/library-detail.component.scss @@ -0,0 +1,4 @@ +.card { + height: 400; + width: 200; +} \ No newline at end of file diff --git a/src/app/library-detail/library-detail.component.ts b/src/app/library-detail/library-detail.component.ts new file mode 100644 index 000000000..fd4625b9b --- /dev/null +++ b/src/app/library-detail/library-detail.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Library } from '../_models/library'; +import { Series } from '../_models/series'; +import { SeriesService } from '../_services/series.service'; + +@Component({ + selector: 'app-library-detail', + templateUrl: './library-detail.component.html', + styleUrls: ['./library-detail.component.scss'] +}) +export class LibraryDetailComponent implements OnInit { + + libraryId!: number; + series: Series[] = []; + + + constructor(private route: ActivatedRoute, private router: Router, private seriesService: SeriesService) { + const routeId = this.route.snapshot.paramMap.get('id'); + if (routeId === null) { + console.error('No library id was passed. Redirecting to home'); + this.router.navigateByUrl('/home'); + return; + } + this.libraryId = parseInt(routeId, 10); + this.seriesService.getSeries(this.libraryId).subscribe(series => { + this.series = series; + }); + } + + ngOnInit(): void { + } + +} diff --git a/src/app/library/library.component.html b/src/app/library/library.component.html index cedd8c65f..f618c2e64 100644 --- a/src/app/library/library.component.html +++ b/src/app/library/library.component.html @@ -1 +1,7 @@ -

library works!

+ +

Libraries

+
+
+ +
+
\ No newline at end of file diff --git a/src/app/library/library.component.ts b/src/app/library/library.component.ts index b33f10b9c..4b2a454ef 100644 --- a/src/app/library/library.component.ts +++ b/src/app/library/library.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; import { take } from 'rxjs/operators'; import { Library } from '../_models/library'; import { User } from '../_models/user'; @@ -16,15 +17,21 @@ export class LibraryComponent implements OnInit { user: User | undefined; libraries: Library[] = []; - constructor(public accountService: AccountService, private memberService: MemberService, private libraryService: LibraryService) { } + constructor(public accountService: AccountService, private libraryService: LibraryService, private router: Router) { } ngOnInit(): void { this.accountService.currentUser$.pipe(take(1)).subscribe(user => { this.user = user; - // this.libraryService.getLibrariesForUser(this.user.username).subscribe(libraries => { - // this.libraries = libraries; - // }); + console.log('user: ', this.user); + this.libraryService.getLibrariesForMember(this.user.username).subscribe(libraries => { + this.libraries = libraries; + console.log('Libraries: ', this.libraries); + }); }); } + handleNavigation(event: any, library: Library) { + this.router.navigateByUrl('/library/' + library.id); + } + } diff --git a/src/app/series-detail/series-detail.component.html b/src/app/series-detail/series-detail.component.html new file mode 100644 index 000000000..2416b8c0a --- /dev/null +++ b/src/app/series-detail/series-detail.component.html @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/src/app/series-detail/series-detail.component.scss b/src/app/series-detail/series-detail.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/series-detail/series-detail.component.ts b/src/app/series-detail/series-detail.component.ts new file mode 100644 index 000000000..54603840e --- /dev/null +++ b/src/app/series-detail/series-detail.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-series-detail', + templateUrl: './series-detail.component.html', + styleUrls: ['./series-detail.component.scss'] +}) +export class SeriesDetailComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/shared/card-item/card-item.component.html b/src/app/shared/card-item/card-item.component.html new file mode 100644 index 000000000..bd8c0e237 --- /dev/null +++ b/src/app/shared/card-item/card-item.component.html @@ -0,0 +1,7 @@ +
+ {{title}} + +
+
{{title}}
+
+
\ No newline at end of file diff --git a/src/app/shared/card-item/card-item.component.scss b/src/app/shared/card-item/card-item.component.scss new file mode 100644 index 000000000..a6b9c3588 --- /dev/null +++ b/src/app/shared/card-item/card-item.component.scss @@ -0,0 +1,9 @@ +.card { + margin: 5px; + max-width: 130px; + max-height: 195px; +} + +.card-body { + padding: 5px !important; +} \ No newline at end of file diff --git a/src/app/shared/card-item/card-item.component.ts b/src/app/shared/card-item/card-item.component.ts new file mode 100644 index 000000000..479765d76 --- /dev/null +++ b/src/app/shared/card-item/card-item.component.ts @@ -0,0 +1,36 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; + +export interface CardItemTitle { + title: string; + linkUrl: string; +} + +@Component({ + selector: 'app-card-item', + templateUrl: './card-item.component.html', + styleUrls: ['./card-item.component.scss'] +}) +export class CardItemComponent implements OnInit { + + @Input() imageUrl = ''; + @Input() title = ''; + @Output() clicked = new EventEmitter(); + + placeholderImage = 'assets/images/image-placeholder.jpg'; //../../.. + + constructor() { } + + ngOnInit(): void { + console.log('card item'); + console.log('imageUrl: ', this.imageUrl); + } + + handleClick() { + this.clicked.emit(this.title); + } + + isNullOrEmpty(val: string) { + return val === null || val === undefined || val === ''; + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index d3b94d520..f8cc3fc44 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -2,17 +2,19 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RegisterMemberComponent } from './register-member/register-member.component'; import { ReactiveFormsModule } from '@angular/forms'; +import { CardItemComponent } from './card-item/card-item.component'; @NgModule({ - declarations: [RegisterMemberComponent], + declarations: [RegisterMemberComponent, CardItemComponent], imports: [ CommonModule, ReactiveFormsModule ], exports: [ - RegisterMemberComponent + RegisterMemberComponent, + CardItemComponent ] }) export class SharedModule { } diff --git a/src/assets/images/image-placeholder.jpg b/src/assets/images/image-placeholder.jpg new file mode 100644 index 000000000..872022b56 Binary files /dev/null and b/src/assets/images/image-placeholder.jpg differ