diff --git a/src/app/app.component.html b/src/app/app.component.html index 10d0c83..a115b2f 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,7 @@ + ☰ diff --git a/src/components/create-modal/create-modal/create-modal.component.css b/src/components/create-modal/create-edit-modal/create-edit-modal.component.css similarity index 100% rename from src/components/create-modal/create-modal/create-modal.component.css rename to src/components/create-modal/create-edit-modal/create-edit-modal.component.css diff --git a/src/components/create-modal/create-modal/create-modal.component.html b/src/components/create-modal/create-edit-modal/create-edit-modal.component.html similarity index 91% rename from src/components/create-modal/create-modal/create-modal.component.html rename to src/components/create-modal/create-edit-modal/create-edit-modal.component.html index 69e43d5..951fd1b 100644 --- a/src/components/create-modal/create-modal/create-modal.component.html +++ b/src/components/create-modal/create-edit-modal/create-edit-modal.component.html @@ -1,5 +1,11 @@ - Add new show + + @if (editMode) { + Edit show + } @else { + Add new show + } + diff --git a/src/components/create-modal/create-modal/create-modal.component.spec.ts b/src/components/create-modal/create-edit-modal/create-edit-modal.component.spec.ts similarity index 56% rename from src/components/create-modal/create-modal/create-modal.component.spec.ts rename to src/components/create-modal/create-edit-modal/create-edit-modal.component.spec.ts index 66f91f8..8acc209 100644 --- a/src/components/create-modal/create-modal/create-modal.component.spec.ts +++ b/src/components/create-modal/create-edit-modal/create-edit-modal.component.spec.ts @@ -1,18 +1,18 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {CreateModalComponent} from './create-modal.component'; +import {CreateEditModalComponent} from './create-edit-modal.component'; describe('CreateModalComponent', () => { - let component: CreateModalComponent; - let fixture: ComponentFixture; + let component: CreateEditModalComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [CreateModalComponent] + imports: [CreateEditModalComponent] }) .compileComponents(); - fixture = TestBed.createComponent(CreateModalComponent); + fixture = TestBed.createComponent(CreateEditModalComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/components/create-modal/create-modal/create-modal.component.ts b/src/components/create-modal/create-edit-modal/create-edit-modal.component.ts similarity index 51% rename from src/components/create-modal/create-modal/create-modal.component.ts rename to src/components/create-modal/create-edit-modal/create-edit-modal.component.ts index b503914..6a7b561 100644 --- a/src/components/create-modal/create-modal/create-modal.component.ts +++ b/src/components/create-modal/create-edit-modal/create-edit-modal.component.ts @@ -4,29 +4,45 @@ import {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/ import {ShowsApiService} from '../../../services/shows/shows-api.service'; import {ShowsApiCreation} from '../../../interfaces/shows-api-creation'; 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({ - selector: 'app-create-modal', + selector: 'app-create-edit-modal', imports: [ ReactiveFormsModule ], - templateUrl: './create-modal.component.html', - styleUrl: './create-modal.component.css' + templateUrl: './create-edit-modal.component.html', + styleUrl: './create-edit-modal.component.css' }) -export class CreateModalComponent { +export class CreateEditModalComponent { private activeModal = inject(NgbActiveModal) private showsService = inject(ShowsApiService) private toastService = inject(ToastService) - protected newShowForm: FormGroup + protected newShowForm: FormGroup = new FormGroup({}) + + protected editMode: boolean = false + protected show?: Show constructor() { + this.initForm() + } + + private initForm() { + let formattedDate: string this.newShowForm = new FormGroup({ - title: new FormControl("", Validators.required), - date: new FormControl("", Validators.required), - seasons: new FormControl("", [Validators.required, Validators.min(1)]), - episodes: new FormControl("", [Validators.required, Validators.min(1)]), - description: new FormControl("", Validators.required) + title: new FormControl(this.show?.title, Validators.required), + seasons: new FormControl(this.show?.seasons, [Validators.required, Validators.min(1)]), + episodes: new FormControl(this.show?.episodes, [Validators.required, Validators.min(1)]), + description: new FormControl(this.show?.description, 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() { @@ -34,17 +50,18 @@ export class CreateModalComponent { } protected formSubmitted(form: FormGroup) { - let show: {} = { + let show: Show = { title: form.get("title")?.value, date: form.get("date")?.value, seasons: form.get("seasons")?.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({ next: (response: ShowsApiCreation) => { - newId = response.newId + show._id = response.newId }, error: err => { this.toastService.show({ body: "Could not add show!", @@ -56,7 +73,7 @@ export class CreateModalComponent { body: "Show added successfully!", htmlClass: "bg-success text-light" }) - this.activeModal.close(newId) + this.activeModal.close(show) } }) } diff --git a/src/components/delete-modal/delete-modal.component.ts b/src/components/delete-modal/delete-modal.component.ts index 6031af5..bb2085a 100644 --- a/src/components/delete-modal/delete-modal.component.ts +++ b/src/components/delete-modal/delete-modal.component.ts @@ -33,10 +33,11 @@ export class DeleteModalComponent { deletePressed() { - const regex = new RegExp(this.showName) - const control = new FormControl("", [Validators.required, Validators.pattern(regex)]) - this.confirmationForm.setControl("name", control) 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.buttonDisabled = true; } else { diff --git a/src/interfaces/show.ts b/src/interfaces/show.ts index 9655a9c..bdb1933 100644 --- a/src/interfaces/show.ts +++ b/src/interfaces/show.ts @@ -1,5 +1,6 @@ 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 date: Date seasons: number diff --git a/src/interfaces/shows-api-deletion-edit.ts b/src/interfaces/shows-api-deletion-edit.ts new file mode 100644 index 0000000..a39c6ca --- /dev/null +++ b/src/interfaces/shows-api-deletion-edit.ts @@ -0,0 +1,4 @@ +export interface ShowsApiDeletionEdit { + status: string + message: string +} diff --git a/src/interfaces/shows-api-deletion.ts b/src/interfaces/shows-api-deletion.ts deleted file mode 100644 index 207da69..0000000 --- a/src/interfaces/shows-api-deletion.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ShowsApiDeletion { - status: string - message: string -} diff --git a/src/pages/shows/shows.component.ts b/src/pages/shows/shows.component.ts index 44add53..31a9b9c 100644 --- a/src/pages/shows/shows.component.ts +++ b/src/pages/shows/shows.component.ts @@ -5,11 +5,10 @@ import {ShowsApiResponse} from '../../interfaces/shows-api-response'; import {Toast} from '../../interfaces/toast'; import {ToastService} from '../../services/toast/toast.service'; 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 {ShowsApiIdResponse} from '../../interfaces/shows-api-id-response'; 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({ selector: 'app-shows', @@ -47,39 +46,35 @@ export class ShowsComponent { } createNewShow() { - this.modalService.open(CreateModalComponent).result.then( + this.modalService.open(CreateEditModalComponent).result.then( + (result: Show) => { + this.shows.push(result) + }, (result) => { - console.log(`Result: ${result}`) - - this.api.getShow(result).subscribe({ - next: (response: ShowsApiIdResponse) => { - this.shows.push(response.show) - }, error: (err: any) => { - console.error(`Error: ${err}`) - }, complete: () => { - } - }) + // Dismissed, do nothing } ) } deleteShow(show: Show) { - let modal: NgbModalRef = this.modalService.open(DeleteModalComponent) + const modal: NgbModalRef = this.modalService.open(DeleteModalComponent) modal.componentInstance.showName = show.title; modal.result.then( (result) => { if (result) { - this.api.deleteShw(show._id).subscribe({ - next: (response: ShowsApiDeletion) => { - // Do nothing - }, error: (err: any) => { - console.log(err) - }, complete: () => { - this.toastService.show({body: "Show deleted!"}) - this.shows = this.shows.filter(((s: Show) => s != show)) + if (show._id != null) { + this.api.deleteShw(show._id).subscribe({ + next: (response: ShowsApiDeletionEdit) => { + // Do nothing + }, error: (err: any) => { + console.log(err) + }, complete: () => { + this.toastService.show({body: "Show deleted!"}) + this.shows = this.shows.filter(((s: Show) => s != show)) + } } - } - ) + ) + } } }, (result) => { diff --git a/src/services/shows/shows-api.service.ts b/src/services/shows/shows-api.service.ts index 4a65bfd..31235a6 100644 --- a/src/services/shows/shows-api.service.ts +++ b/src/services/shows/shows-api.service.ts @@ -4,7 +4,8 @@ import {Observable} from 'rxjs'; import {ShowsApiResponse} from '../../interfaces/shows-api-response'; import {ShowsApiCreation} from '../../interfaces/shows-api-creation'; 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({ providedIn: 'root' @@ -27,11 +28,15 @@ export class ShowsApiService { return this.http.get(this.showsEndpoint + "id/" + id) } - sendShow(newShow: {}) { + sendShow(newShow: Show): Observable { return this.http.post(this.showsEndpoint, newShow) } - deleteShw(id: string): Observable { - return this.http.delete(this.showsEndpoint + "id/" + id) + deleteShw(id: string): Observable { + return this.http.delete(this.showsEndpoint + "id/" + id) + } + + updateShow(show: Show): Observable { + return this.http.put(this.showsEndpoint + "id/" + show._id, show) } }