Compare commits

...

17 commits

Author SHA1 Message Date
faac2fc2e2 Services/shows: add update show function 2025-02-06 10:39:18 +01:00
6461855175 Interfaces/shows-api: rename shows-api-deletion to shows-api-deletion-edit 2025-02-06 10:38:49 +01:00
d9c96be8c4 Add icon to navbar 2025-02-06 09:40:52 +01:00
afa9b4a4a1 Services/shows: refactor 2025-02-05 02:36:04 +01:00
42329818a5 Pages/shows: remove unused import 2025-02-05 02:28:39 +01:00
77be63e88f Components/create-edit-modal: return new show instead of id on creation 2025-02-05 02:27:55 +01:00
b52a8af0bf Components/create-edit-modal: change new show variable type 2025-02-05 02:21:32 +01:00
92360fdad9 Interfaces/show: make id optional 2025-02-05 02:20:40 +01:00
ee6ebfd98c Components/create-edit-modal: fix date input in edit mode 2025-02-05 02:13:13 +01:00
ef02fe8c82 Pages/shows: change delete modal ref to const from let 2025-02-05 01:54:17 +01:00
3a95b89bf7 Pages/shows: ignore create modal dismiss result 2025-02-05 01:53:47 +01:00
fd41663f86 Components/create-edit-modal: move FormGroup init to separate function 2025-02-05 01:52:08 +01:00
be31699167 Components/create-edit-modal: show values from show, if set 2025-02-05 01:50:46 +01:00
3c80eadf7e Components/create-edit-modal: change title depending on mode 2025-02-05 01:49:35 +01:00
d9e773c736 Components/create-edit-modal: add editMode and show variables 2025-02-05 01:49:06 +01:00
e16cda30cc Components/create-modal: rename to create-edit-modal 2025-02-05 01:31:01 +01:00
d9a26a6645 Components/delete-modal: fix 2025-02-05 01:12:56 +01:00
11 changed files with 84 additions and 58 deletions

View file

@ -1,6 +1,7 @@
<app-toast-container aria-live="polite" aria-atomic="true"/>
<nav class="navbar navbar-expand-sm bg-body-secondary">
<div class="container-fluid">
<i class="bi bi-film navbar-brand"></i>
<button class="navbar-toggler" type="button" (click)="isMenuCollapsed = !isMenuCollapsed">&#9776;</button>
<div [ngbCollapse]="isMenuCollapsed" class="collapse navbar-collapse">
<ul class="navbar-nav">

View file

@ -1,5 +1,11 @@
<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>
</div>
<form [formGroup]="newShowForm" (submit)="formSubmitted(newShowForm)">

View file

@ -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<CreateModalComponent>;
let component: CreateEditModalComponent;
let fixture: ComponentFixture<CreateEditModalComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CreateModalComponent]
imports: [CreateEditModalComponent]
})
.compileComponents();
fixture = TestBed.createComponent(CreateModalComponent);
fixture = TestBed.createComponent(CreateEditModalComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

View file

@ -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)
}
})
}

View file

@ -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 {

View file

@ -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

View file

@ -0,0 +1,4 @@
export interface ShowsApiDeletionEdit {
status: string
message: string
}

View file

@ -1,4 +0,0 @@
export interface ShowsApiDeletion {
status: string
message: string
}

View file

@ -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) => {

View file

@ -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<ShowsApiIdResponse>(this.showsEndpoint + "id/" + id)
}
sendShow(newShow: {}) {
sendShow(newShow: Show): Observable<ShowsApiCreation> {
return this.http.post<ShowsApiCreation>(this.showsEndpoint, newShow)
}
deleteShw(id: string): Observable<ShowsApiDeletion> {
return this.http.delete<ShowsApiDeletion>(this.showsEndpoint + "id/" + id)
deleteShw(id: string): Observable<ShowsApiDeletionEdit> {
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)
}
}