From d624637e3e9a3b8b01dfec2f48cd878163aea48b Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Thu, 27 Jul 2023 12:01:19 +0200 Subject: [PATCH] some semi finished features --- src/server/backend/api/getHandler.js | 3 +- src/server/backend/api/postHandler.js | 1 + src/webapp/main/src/App.vue | 2 +- src/webapp/main/src/components/noseatplan.vue | 2 + src/webapp/main/src/components/seatplan.vue | 379 ------------------ .../seatplan/userApp/userWindow.vue | 54 ++- .../views/purchasing/TicketsOrderingView.vue | 3 - 7 files changed, 48 insertions(+), 396 deletions(-) delete mode 100644 src/webapp/main/src/components/seatplan.vue diff --git a/src/server/backend/api/getHandler.js b/src/server/backend/api/getHandler.js index 6a2c646..d827f95 100644 --- a/src/server/backend/api/getHandler.js +++ b/src/server/backend/api/getHandler.js @@ -30,10 +30,9 @@ class GETHandler { if ( query.event ) { db.getJSONDataSimple( 'booked', query.event ).then( data => { db.getDataSimple( 'temp', 'user_id', session.id ).then( dat => { - resolve( { 'booked': data ?? {}, 'user': dat[ 0 ] ? JSON.parse( dat[ 0 ].data )[ query.event ] ?? {} : {} } ); + resolve( { 'booked': data ? data.booked : {}, 'user': dat[ 0 ] ? JSON.parse( dat[ 0 ].data )[ query.event ] ?? {} : {} } ); } ); } ).catch( error => { - console.error( error ); reject( { 'code': 500, 'message': error } ); } ); } else { diff --git a/src/server/backend/api/postHandler.js b/src/server/backend/api/postHandler.js index fd4e4c4..14a3f45 100644 --- a/src/server/backend/api/postHandler.js +++ b/src/server/backend/api/postHandler.js @@ -12,6 +12,7 @@ const db = require( '../db/db.js' ); class POSTHandler { constructor () { this.allSelectedSeats = { 'TestEvent2': [ { 'id': 'secAr1s1', 'component': 1 } ] }; + this.ticketTotals = {}; } // Add lang in the future diff --git a/src/webapp/main/src/App.vue b/src/webapp/main/src/App.vue index 5aa67d0..77a8f44 100644 --- a/src/webapp/main/src/App.vue +++ b/src/webapp/main/src/App.vue @@ -183,7 +183,7 @@ export default { // } else if ( window.webpage.engine.presto ) { // alert( 'Welcome! We have detected that you are a very old version of Opera or related browser. As a modern webapp, libreevent does only support modern browsers. If you run into issues whilst using this webapp, please switch to a modern browser, like Firefox.' ) // } - this.theme = localStorage.getItem( 'theme' ) ? localStorage.getItem( 'theme' ) : ''; + this.theme = localStorage.getItem( 'theme' ) ?? ''; if ( window.matchMedia( '(prefers-color-scheme: dark)' ).matches || this.theme === '☼' ) { document.documentElement.classList.add( 'dark' ); this.theme = '☼'; diff --git a/src/webapp/main/src/components/noseatplan.vue b/src/webapp/main/src/components/noseatplan.vue index b1a6aad..ffbb499 100644 --- a/src/webapp/main/src/components/noseatplan.vue +++ b/src/webapp/main/src/components/noseatplan.vue @@ -65,6 +65,7 @@ export default { } else { this.cartHandling( 'select', this.tickets[ id ], option ); } + // TODO: make call to server to reserve ticket }, cartHandling ( operation, data, option ) { if ( operation === 'select' ) { @@ -99,6 +100,7 @@ export default { } } } + // TODO: Make call to server to deselect ticket }, loadTickets () { // TODO: Load from server diff --git a/src/webapp/main/src/components/seatplan.vue b/src/webapp/main/src/components/seatplan.vue deleted file mode 100644 index 124cd92..0000000 --- a/src/webapp/main/src/components/seatplan.vue +++ /dev/null @@ -1,379 +0,0 @@ - - - - - diff --git a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index 0aa1cc5..a638b6f 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -299,10 +299,14 @@ if ( this.cart[ this.event.name ] ) { let tickets = this.cart[ this.event.name ][ 'tickets' ]; - for ( let ticket in tickets ) { - this.draggables[ tickets[ ticket ].comp ][ 'data' ][ 'unavailableSeats' ][ ticket ] = 'sel'; + for ( let seat in tickets ) { + if ( !unavailableSeats[ data.user[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ tickets[ seat ].component ][ tickets[ seat ].id ] = 'sel'; } } + }, scaleUp ( valueArray ) { const allowedAttributes = [ 'w', 'h', 'x', 'y' ]; @@ -433,23 +437,51 @@ if ( !this.cart[ this.event.name ] ) { this.cart[ this.event.name ] = { 'displayName': this.event.name, 'tickets': {} }; } - + for ( let group in data.data ) { if ( !this.cart[ this.event.name ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { if ( data.data[ group ] > 0 ) { - this.cart[ this.event.name ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; + const options = { + method: 'post', + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': '', 'eventID': this.event.name, 'count': data.data[ group ] } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { + if ( res.status === 200 ) { + this.cart[ this.event.name ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; + } else if ( res.status === 409 ) { + setTimeout( () => { + this.$refs.popups.openPopup( 'Unfortunately, the seat you just tried to select was reserved by somebody else since the last time the seat plan was refreshed. Please select another one. We are sorry for the inconvenience.', {}, 'string' ); + }, 300 ); + } + if ( Object.keys( this.cart[ this.event.name ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.name ]; + } + + this.$refs.cart.calculateTotal(); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } ); } else { delete this.cart[ this.event.name ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; + const options = { + method: 'post', + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.name } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { + res.text().then( text => { + console.log( text ); + } ); + } ); } } } - // TODO: Make call to server to reserve ticket - if ( Object.keys( this.cart[ this.event.name ][ 'tickets' ] ).length < 1 ) { - delete this.cart[ this.event.name ]; - } - - this.$refs.cart.calculateTotal(); - localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); } }, created () { diff --git a/src/webapp/main/src/views/purchasing/TicketsOrderingView.vue b/src/webapp/main/src/views/purchasing/TicketsOrderingView.vue index bdec675..3fd788d 100644 --- a/src/webapp/main/src/views/purchasing/TicketsOrderingView.vue +++ b/src/webapp/main/src/views/purchasing/TicketsOrderingView.vue @@ -59,9 +59,6 @@ this.$router.push( '/tickets' ); } this.eventID = sessionStorage.getItem( 'selectedTicket' ); - // if ( this.eventID == 'test2' ) { - // this.hasSeatplan = false; - // } } };