diff --git a/package-lock.json b/package-lock.json index 9dbe2fe..d26398e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@infinimotion/model-frontend": "^0.0.102", "@tailwindcss/postcss": "^4.1.14", "angularx-qrcode": "^20.0.0", + "canvas-confetti": "^1.9.4", "ngx-mask": "^20.0.3", "postcss": "^8.5.6", "rxjs": "~7.8.0", @@ -4431,6 +4432,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canvas-confetti": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.4.tgz", + "integrity": "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==", + "license": "ISC", + "funding": { + "type": "donate", + "url": "https://www.paypal.me/kirilvatev" + } + }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", diff --git a/package.json b/package.json index 41b72cb..955f4ce 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@infinimotion/model-frontend": "^0.0.102", "@tailwindcss/postcss": "^4.1.14", "angularx-qrcode": "^20.0.0", + "canvas-confetti": "^1.9.4", "ngx-mask": "^20.0.3", "postcss": "^8.5.6", "rxjs": "~7.8.0", diff --git a/src/app/order/order.component.html b/src/app/order/order.component.html index 2b5831e..ad0a5bc 100644 --- a/src/app/order/order.component.html +++ b/src/app/order/order.component.html @@ -141,7 +141,7 @@ - Kartenname + Name des Besitzers @if (fPayment['cardName'].hasError('minlength')) { Mindestens 3 Zeichen } diff --git a/src/app/order/order.component.ts b/src/app/order/order.component.ts index 1449912..79dbc5f 100644 --- a/src/app/order/order.component.ts +++ b/src/app/order/order.component.ts @@ -27,11 +27,13 @@ export class OrderComponent { private httpService = inject(HttpService) private selectedSeatsService = inject(SelectedSeatsService); + confetti: any; + constructor(private fb: FormBuilder) {} // Form-Validation - ngOnInit(): void { + async ngOnInit() { this.paymentForm = this.fb.group({ cardNumber: ['', [Validators.required, Validators.pattern(/^\d{16}$/)]], cardName: ['', [Validators.required, Validators.minLength(3)]], @@ -43,6 +45,7 @@ export class OrderComponent { email: ['', [Validators.required, Validators.email]], accept: ['', Validators.requiredTrue], }); + this.confetti = (await import('canvas-confetti')).default; } get fData() { return this.dataForm.controls; } @@ -116,7 +119,6 @@ export class OrderComponent { const order = this.generateNewOrderObject(this.dataForm.value.email, false); const seats = this.selectedSeatsService.getSelectedSeatsList(); const performance = this.performance()!; - this.successful = true; this.sendToBackend(order, seats, performance); this.seatsReserved = true; } @@ -128,7 +130,6 @@ export class OrderComponent { const order = this.generateNewOrderObject(this.dataForm.value.email, true); const seats = this.selectedSeatsService.getSelectedSeatsList(); const performance = this.performance()!; - this.successful = true; this.sendToBackend(order, seats, performance); this.seatsPurchased = true; } @@ -147,13 +148,28 @@ export class OrderComponent { }); Promise.all(ticketCreations.map(obs => obs.toPromise())) - .then(createdTickets => { + .then(async createdTickets => { this.createdTickets = createdTickets.filter( (ticket): ticket is Eintrittskarte => ticket !== undefined ); + this.successful = true; + this.selectedSeatsService.setCommitedTrue(); this.loadingService.hide(); - this.enableInputs(); + + this.confetti({ + particleCount: 100, + angle: 0, + spread: 180, + origin: { x: -0.1, y: 0.75 } + }); + this.confetti({ + particleCount: 100, + angle: 180, + spread: 180, + origin: { x: 1.1, y: 0.75 } + }); + }) .catch(err => { this.loadingService.showError(err); diff --git a/src/app/seat/seat.component.html b/src/app/seat/seat.component.html index 57ca2a1..975c099 100644 --- a/src/app/seat/seat.component.html +++ b/src/app/seat/seat.component.html @@ -1,7 +1,7 @@