Compare commits
17 commits
d1fd09ab75
...
faac2fc2e2
| Author | SHA1 | Date | |
|---|---|---|---|
| faac2fc2e2 | |||
| 6461855175 | |||
| d9c96be8c4 | |||
| afa9b4a4a1 | |||
| 42329818a5 | |||
| 77be63e88f | |||
| b52a8af0bf | |||
| 92360fdad9 | |||
| ee6ebfd98c | |||
| ef02fe8c82 | |||
| 3a95b89bf7 | |||
| fd41663f86 | |||
| be31699167 | |||
| 3c80eadf7e | |||
| d9e773c736 | |||
| e16cda30cc | |||
| d9a26a6645 |
11 changed files with 84 additions and 58 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
<app-toast-container aria-live="polite" aria-atomic="true"/>
|
<app-toast-container aria-live="polite" aria-atomic="true"/>
|
||||||
<nav class="navbar navbar-expand-sm bg-body-secondary">
|
<nav class="navbar navbar-expand-sm bg-body-secondary">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
|
<i class="bi bi-film navbar-brand"></i>
|
||||||
<button class="navbar-toggler" type="button" (click)="isMenuCollapsed = !isMenuCollapsed">☰</button>
|
<button class="navbar-toggler" type="button" (click)="isMenuCollapsed = !isMenuCollapsed">☰</button>
|
||||||
<div [ngbCollapse]="isMenuCollapsed" class="collapse navbar-collapse">
|
<div [ngbCollapse]="isMenuCollapsed" class="collapse navbar-collapse">
|
||||||
<ul class="navbar-nav">
|
<ul class="navbar-nav">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h4 class="modal-title"> Add new show</h4>
|
<h4 class="modal-title">
|
||||||
|
@if (editMode) {
|
||||||
|
Edit show
|
||||||
|
} @else {
|
||||||
|
Add new show
|
||||||
|
}
|
||||||
|
</h4>
|
||||||
<button type="button" class="btn-close" aria-label="Close" (click)="dismiss()"></button>
|
<button type="button" class="btn-close" aria-label="Close" (click)="dismiss()"></button>
|
||||||
</div>
|
</div>
|
||||||
<form [formGroup]="newShowForm" (submit)="formSubmitted(newShowForm)">
|
<form [formGroup]="newShowForm" (submit)="formSubmitted(newShowForm)">
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
import {ComponentFixture, TestBed} from '@angular/core/testing';
|
import {ComponentFixture, TestBed} from '@angular/core/testing';
|
||||||
|
|
||||||
import {CreateModalComponent} from './create-modal.component';
|
import {CreateEditModalComponent} from './create-edit-modal.component';
|
||||||
|
|
||||||
describe('CreateModalComponent', () => {
|
describe('CreateModalComponent', () => {
|
||||||
let component: CreateModalComponent;
|
let component: CreateEditModalComponent;
|
||||||
let fixture: ComponentFixture<CreateModalComponent>;
|
let fixture: ComponentFixture<CreateEditModalComponent>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await TestBed.configureTestingModule({
|
await TestBed.configureTestingModule({
|
||||||
imports: [CreateModalComponent]
|
imports: [CreateEditModalComponent]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
|
|
||||||
fixture = TestBed.createComponent(CreateModalComponent);
|
fixture = TestBed.createComponent(CreateEditModalComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
||||||
|
|
@ -4,29 +4,45 @@ import {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/
|
||||||
import {ShowsApiService} from '../../../services/shows/shows-api.service';
|
import {ShowsApiService} from '../../../services/shows/shows-api.service';
|
||||||
import {ShowsApiCreation} from '../../../interfaces/shows-api-creation';
|
import {ShowsApiCreation} from '../../../interfaces/shows-api-creation';
|
||||||
import {ToastService} from '../../../services/toast/toast.service';
|
import {ToastService} from '../../../services/toast/toast.service';
|
||||||
|
import {Show} from '../../../interfaces/show';
|
||||||
|
import {formatDate} from '@angular/common';
|
||||||
|
import {ShowsApiDeletionEdit} from '../../../interfaces/shows-api-deletion-edit';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-create-modal',
|
selector: 'app-create-edit-modal',
|
||||||
imports: [
|
imports: [
|
||||||
ReactiveFormsModule
|
ReactiveFormsModule
|
||||||
],
|
],
|
||||||
templateUrl: './create-modal.component.html',
|
templateUrl: './create-edit-modal.component.html',
|
||||||
styleUrl: './create-modal.component.css'
|
styleUrl: './create-edit-modal.component.css'
|
||||||
})
|
})
|
||||||
export class CreateModalComponent {
|
export class CreateEditModalComponent {
|
||||||
private activeModal = inject(NgbActiveModal)
|
private activeModal = inject(NgbActiveModal)
|
||||||
private showsService = inject(ShowsApiService)
|
private showsService = inject(ShowsApiService)
|
||||||
private toastService = inject(ToastService)
|
private toastService = inject(ToastService)
|
||||||
protected newShowForm: FormGroup
|
protected newShowForm: FormGroup = new FormGroup({})
|
||||||
|
|
||||||
|
protected editMode: boolean = false
|
||||||
|
protected show?: Show
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
this.initForm()
|
||||||
|
}
|
||||||
|
|
||||||
|
private initForm() {
|
||||||
|
let formattedDate: string
|
||||||
this.newShowForm = new FormGroup({
|
this.newShowForm = new FormGroup({
|
||||||
title: new FormControl("", Validators.required),
|
title: new FormControl(this.show?.title, Validators.required),
|
||||||
date: new FormControl("", Validators.required),
|
seasons: new FormControl(this.show?.seasons, [Validators.required, Validators.min(1)]),
|
||||||
seasons: new FormControl("", [Validators.required, Validators.min(1)]),
|
episodes: new FormControl(this.show?.episodes, [Validators.required, Validators.min(1)]),
|
||||||
episodes: new FormControl("", [Validators.required, Validators.min(1)]),
|
description: new FormControl(this.show?.description, Validators.required)
|
||||||
description: new FormControl("", Validators.required)
|
|
||||||
})
|
})
|
||||||
|
if (this.show?.date !== undefined) {
|
||||||
|
formattedDate = formatDate(this.show?.date, "YYYY-MM-dd", "en")
|
||||||
|
} else {
|
||||||
|
formattedDate = ""
|
||||||
|
}
|
||||||
|
this.newShowForm.addControl("date", new FormControl(formattedDate, Validators.required))
|
||||||
}
|
}
|
||||||
|
|
||||||
protected dismiss() {
|
protected dismiss() {
|
||||||
|
|
@ -34,17 +50,18 @@ export class CreateModalComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected formSubmitted(form: FormGroup) {
|
protected formSubmitted(form: FormGroup) {
|
||||||
let show: {} = {
|
let show: Show = {
|
||||||
title: form.get("title")?.value,
|
title: form.get("title")?.value,
|
||||||
date: form.get("date")?.value,
|
date: form.get("date")?.value,
|
||||||
seasons: form.get("seasons")?.value,
|
seasons: form.get("seasons")?.value,
|
||||||
episodes: form.get("episodes")?.value,
|
episodes: form.get("episodes")?.value,
|
||||||
description: form.get("description")?.value
|
description: form.get("description")?.value,
|
||||||
|
//TODO: Allow user to specify genres
|
||||||
|
genres: []
|
||||||
}
|
}
|
||||||
let newId: string;
|
|
||||||
this.showsService.sendShow(show).subscribe({
|
this.showsService.sendShow(show).subscribe({
|
||||||
next: (response: ShowsApiCreation) => {
|
next: (response: ShowsApiCreation) => {
|
||||||
newId = response.newId
|
show._id = response.newId
|
||||||
}, error: err => {
|
}, error: err => {
|
||||||
this.toastService.show({
|
this.toastService.show({
|
||||||
body: "Could not add show!",
|
body: "Could not add show!",
|
||||||
|
|
@ -56,7 +73,7 @@ export class CreateModalComponent {
|
||||||
body: "Show added successfully!",
|
body: "Show added successfully!",
|
||||||
htmlClass: "bg-success text-light"
|
htmlClass: "bg-success text-light"
|
||||||
})
|
})
|
||||||
this.activeModal.close(newId)
|
this.activeModal.close(show)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -33,10 +33,11 @@ export class DeleteModalComponent {
|
||||||
|
|
||||||
|
|
||||||
deletePressed() {
|
deletePressed() {
|
||||||
const regex = new RegExp(this.showName)
|
|
||||||
const control = new FormControl("", [Validators.required, Validators.pattern(regex)])
|
|
||||||
this.confirmationForm.setControl("name", control)
|
|
||||||
if (this.formHidden) {
|
if (this.formHidden) {
|
||||||
|
// Only add the control the first time the button is pressed
|
||||||
|
const regex = new RegExp(this.showName)
|
||||||
|
const control = new FormControl("", [Validators.required, Validators.pattern(regex)])
|
||||||
|
this.confirmationForm.setControl("name", control)
|
||||||
this.formHidden = false;
|
this.formHidden = false;
|
||||||
this.buttonDisabled = true;
|
this.buttonDisabled = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
export interface Show {
|
export interface Show {
|
||||||
_id: string
|
// ID is assigned by the DB, so I don't want to have to specify it
|
||||||
|
_id?: string
|
||||||
title: string
|
title: string
|
||||||
date: Date
|
date: Date
|
||||||
seasons: number
|
seasons: number
|
||||||
|
|
|
||||||
4
src/interfaces/shows-api-deletion-edit.ts
Normal file
4
src/interfaces/shows-api-deletion-edit.ts
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
export interface ShowsApiDeletionEdit {
|
||||||
|
status: string
|
||||||
|
message: string
|
||||||
|
}
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
export interface ShowsApiDeletion {
|
|
||||||
status: string
|
|
||||||
message: string
|
|
||||||
}
|
|
||||||
|
|
@ -5,11 +5,10 @@ import {ShowsApiResponse} from '../../interfaces/shows-api-response';
|
||||||
import {Toast} from '../../interfaces/toast';
|
import {Toast} from '../../interfaces/toast';
|
||||||
import {ToastService} from '../../services/toast/toast.service';
|
import {ToastService} from '../../services/toast/toast.service';
|
||||||
import {NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap';
|
import {NgbModal, NgbModalRef} from '@ng-bootstrap/ng-bootstrap';
|
||||||
import {CreateModalComponent} from '../../components/create-modal/create-modal/create-modal.component';
|
import {CreateEditModalComponent} from '../../components/create-modal/create-edit-modal/create-edit-modal.component';
|
||||||
import {DatePipe} from '@angular/common';
|
import {DatePipe} from '@angular/common';
|
||||||
import {ShowsApiIdResponse} from '../../interfaces/shows-api-id-response';
|
|
||||||
import {DeleteModalComponent} from '../../components/delete-modal/delete-modal.component';
|
import {DeleteModalComponent} from '../../components/delete-modal/delete-modal.component';
|
||||||
import {ShowsApiDeletion} from '../../interfaces/shows-api-deletion';
|
import {ShowsApiDeletionEdit} from '../../interfaces/shows-api-deletion-edit';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-shows',
|
selector: 'app-shows',
|
||||||
|
|
@ -47,39 +46,35 @@ export class ShowsComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
createNewShow() {
|
createNewShow() {
|
||||||
this.modalService.open(CreateModalComponent).result.then(
|
this.modalService.open(CreateEditModalComponent).result.then(
|
||||||
|
(result: Show) => {
|
||||||
|
this.shows.push(result)
|
||||||
|
},
|
||||||
(result) => {
|
(result) => {
|
||||||
console.log(`Result: ${result}`)
|
// Dismissed, do nothing
|
||||||
|
|
||||||
this.api.getShow(result).subscribe({
|
|
||||||
next: (response: ShowsApiIdResponse) => {
|
|
||||||
this.shows.push(response.show)
|
|
||||||
}, error: (err: any) => {
|
|
||||||
console.error(`Error: ${err}`)
|
|
||||||
}, complete: () => {
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteShow(show: Show) {
|
deleteShow(show: Show) {
|
||||||
let modal: NgbModalRef = this.modalService.open(DeleteModalComponent)
|
const modal: NgbModalRef = this.modalService.open(DeleteModalComponent)
|
||||||
modal.componentInstance.showName = show.title;
|
modal.componentInstance.showName = show.title;
|
||||||
modal.result.then(
|
modal.result.then(
|
||||||
(result) => {
|
(result) => {
|
||||||
if (result) {
|
if (result) {
|
||||||
this.api.deleteShw(show._id).subscribe({
|
if (show._id != null) {
|
||||||
next: (response: ShowsApiDeletion) => {
|
this.api.deleteShw(show._id).subscribe({
|
||||||
// Do nothing
|
next: (response: ShowsApiDeletionEdit) => {
|
||||||
}, error: (err: any) => {
|
// Do nothing
|
||||||
console.log(err)
|
}, error: (err: any) => {
|
||||||
}, complete: () => {
|
console.log(err)
|
||||||
this.toastService.show({body: "Show deleted!"})
|
}, complete: () => {
|
||||||
this.shows = this.shows.filter(((s: Show) => s != show))
|
this.toastService.show({body: "Show deleted!"})
|
||||||
|
this.shows = this.shows.filter(((s: Show) => s != show))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
)
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
(result) => {
|
(result) => {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ import {Observable} from 'rxjs';
|
||||||
import {ShowsApiResponse} from '../../interfaces/shows-api-response';
|
import {ShowsApiResponse} from '../../interfaces/shows-api-response';
|
||||||
import {ShowsApiCreation} from '../../interfaces/shows-api-creation';
|
import {ShowsApiCreation} from '../../interfaces/shows-api-creation';
|
||||||
import {ShowsApiIdResponse} from '../../interfaces/shows-api-id-response';
|
import {ShowsApiIdResponse} from '../../interfaces/shows-api-id-response';
|
||||||
import {ShowsApiDeletion} from '../../interfaces/shows-api-deletion';
|
import {ShowsApiDeletionEdit} from '../../interfaces/shows-api-deletion-edit';
|
||||||
|
import {Show} from '../../interfaces/show';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
|
|
@ -27,11 +28,15 @@ export class ShowsApiService {
|
||||||
return this.http.get<ShowsApiIdResponse>(this.showsEndpoint + "id/" + id)
|
return this.http.get<ShowsApiIdResponse>(this.showsEndpoint + "id/" + id)
|
||||||
}
|
}
|
||||||
|
|
||||||
sendShow(newShow: {}) {
|
sendShow(newShow: Show): Observable<ShowsApiCreation> {
|
||||||
return this.http.post<ShowsApiCreation>(this.showsEndpoint, newShow)
|
return this.http.post<ShowsApiCreation>(this.showsEndpoint, newShow)
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteShw(id: string): Observable<ShowsApiDeletion> {
|
deleteShw(id: string): Observable<ShowsApiDeletionEdit> {
|
||||||
return this.http.delete<ShowsApiDeletion>(this.showsEndpoint + "id/" + id)
|
return this.http.delete<ShowsApiDeletionEdit>(this.showsEndpoint + "id/" + id)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateShow(show: Show): Observable<ShowsApiDeletionEdit> {
|
||||||
|
return this.http.put<ShowsApiDeletionEdit>(this.showsEndpoint + "id/" + show._id, show)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue