fix various bugs in seat plan selector

This commit is contained in:
2023-08-03 11:11:16 +02:00
parent 127bd5b630
commit 19874cd007
3 changed files with 114 additions and 77 deletions

View File

@@ -11,8 +11,8 @@ const db = require( '../db/db.js' );
class POSTHandler { class POSTHandler {
constructor () { constructor () {
this.allSelectedSeats = { 'TestEvent2': [ { 'id': 'secAr1s1', 'component': 1 } ] }; this.allSelectedSeats = { 'test2': [ { 'id': 'secAr1s1', 'component': 1 } ] };
this.ticketTotals = { 'TestEvent2': { 'ticket1': 5, 'ticket2': 5 } }; this.ticketTotals = { 'test2': { 'ticket1': 5, 'ticket2': 5 } };
this.settings = { 'maxTickets': 10 }; this.settings = { 'maxTickets': 10 };
} }
@@ -24,13 +24,16 @@ class POSTHandler {
let transmit = {}; let transmit = {};
if ( dat.length > 0 ) { if ( dat.length > 0 ) {
transmit = JSON.parse( dat[ 0 ].data ); transmit = JSON.parse( dat[ 0 ].data );
} else {
transmit[ data.eventID ] = {};
} }
if ( !this.allSelectedSeats[ data.eventID ] ) { if ( !this.allSelectedSeats[ data.eventID ] ) {
this.allSelectedSeats[ data.eventID ] = []; this.allSelectedSeats[ data.eventID ] = [];
} }
if ( !transmit[ data.eventID ] ) {
transmit[ data.eventID ] = {};
}
if ( this.allSelectedSeats[ data.eventID ].includes( data.id ) && !data.count ) { if ( this.allSelectedSeats[ data.eventID ].includes( data.id ) && !data.count ) {
reject( { 'code': 409, 'message': 'ERR_SEAT_SELECTED' } ); reject( { 'code': 409, 'message': 'ERR_SEAT_SELECTED' } );
return; return;
@@ -62,37 +65,59 @@ class POSTHandler {
} }
db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ), 'timestamp': new Date().toString() } ).then( () => { db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ), 'timestamp': new Date().toString() } ).then( () => {
resolve( 'ok' ); resolve( 'ok' );
} ).catch( () => { } ).catch( error => {
console.error( error );
reject( { 'code': 500, 'message': 'ERR_DB' } ); reject( { 'code': 500, 'message': 'ERR_DB' } );
} ); } );
} else { } else {
reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } ); reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } );
return; return;
} }
} ).catch( () => { } ).catch( error => {
console.error( error );
reject( { 'code': 500, 'message': 'ERR_DB' } ); reject( { 'code': 500, 'message': 'ERR_DB' } );
} ); } );
} else if ( call === 'deselectTicket' ) { } else if ( call === 'deselectTicket' ) {
db.getDataSimple( 'temp', 'user_id', session.id ).then( dat => { db.getDataSimple( 'temp', 'user_id', session.id ).then( dat => {
let transmit = JSON.parse( dat[ 0 ].data ); let transmit = {};
if ( transmit[ data.eventID ] ) { if ( dat[ 0 ] ) {
if ( transmit[ data.eventID ][ data.id ] ) { transmit = JSON.parse( dat[ 0 ].data );
delete transmit[ data.eventID ][ data.id ]; if ( transmit[ data.eventID ] ) {
if ( transmit[ data.eventID ][ data.id ] ) {
delete transmit[ data.eventID ][ data.id ];
} else {
reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } );
}
if ( Object.keys( transmit[ data.eventID ] ).length < 1 ) {
delete transmit[ data.eventID ];
}
} else { } else {
reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } ); reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } );
} }
if ( Object.keys( transmit[ data.eventID ] ).length < 1 ) {
delete transmit[ data.eventID ]; const allSeats = this.allSelectedSeats[ data.eventID ];
for ( let seat in allSeats ) {
if ( allSeats[ seat ].component === data.component ) {
if ( allSeats[ seat ].id === data.id ) {
delete this.allSelectedSeats[ data.eventID ][ seat ];
}
}
} }
} else { } else {
reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } ); reject( { 'code': 404, 'message': 'ERR_DATA_NOT_FOUND' } );
return;
} }
db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ) } ).then( () => { db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'data': JSON.stringify( transmit ) } ).then( () => {
resolve( 'ok' ); resolve( 'ok' );
} ).catch( () => { } ).catch( error => {
console.error( error );
reject( { 'code': 500, 'message': 'ERR_DB' } ); reject( { 'code': 500, 'message': 'ERR_DB' } );
} ); } );
} ).catch( () => { } ).catch( error => {
console.error( error );
reject( { 'code': 500, 'message': 'ERR_DB' } ); reject( { 'code': 500, 'message': 'ERR_DB' } );
} ); } );
} }

View File

@@ -171,26 +171,31 @@
if ( res.status === 200 ) { if ( res.status === 200 ) {
let unavailableSeats = {}; let unavailableSeats = {};
res.json().then( data => { res.json().then( data => {
console.log( data );
for ( let seat in data.booked ) { for ( let seat in data.booked ) {
if ( !unavailableSeats[ data.booked[ seat ].component ] ) { if ( data.booked[ seat ] ) {
unavailableSeats[ data.booked[ seat ].component ]; if ( !unavailableSeats[ data.booked[ seat ].component ] ) {
unavailableSeats[ data.booked[ seat ].component ];
}
unavailableSeats[ data.booked[ seat ].component ][ data.booked[ seat ].id ] = 'nav';
} }
unavailableSeats[ data.booked[ seat ].component ][ data.booked[ seat ].id ] = 'nav';
} }
for ( let seat in data.reserved ) { for ( let seat in data.reserved ) {
if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { if ( data.reserved[ seat ] ) {
unavailableSeats[ data.reserved[ seat ].component ] = {}; if ( !unavailableSeats[ data.reserved[ seat ].component ] ) {
unavailableSeats[ data.reserved[ seat ].component ] = {};
}
unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav';
} }
unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav';
} }
for ( let seat in data.user ) { for ( let seat in data.user ) {
if ( !unavailableSeats[ data.user[ seat ].component ] ) { if ( data.user[ seat ] ) {
unavailableSeats[ data.reserved[ seat ].component ] = {}; if ( !unavailableSeats[ data.user[ seat ].component ] ) {
unavailableSeats[ data.reserved[ seat ].component ] = {};
}
unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel';
} }
unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel';
} }
let tickets = {}; let tickets = {};
@@ -302,10 +307,10 @@
if ( this.cart[ this.event.eventID ] ) { if ( this.cart[ this.event.eventID ] ) {
let tickets = this.cart[ this.event.eventID ][ 'tickets' ]; let tickets = this.cart[ this.event.eventID ][ 'tickets' ];
for ( let seat in tickets ) { for ( let seat in tickets ) {
if ( !unavailableSeats[ data.user[ seat ].component ] ) { if ( !this.unavailableSeats[ data.user[ seat ].component ] ) {
unavailableSeats[ data.reserved[ seat ].component ] = {}; this.unavailableSeats[ data.reserved[ seat ].component ] = {};
} }
unavailableSeats[ tickets[ seat ].component ][ tickets[ seat ].id ] = 'sel'; this.unavailableSeats[ tickets[ seat ].component ][ tickets[ seat ].id ] = 'sel';
} }
} }
@@ -400,17 +405,13 @@
// Make call to server to deselect ticket // Make call to server to deselect ticket
const options = { const options = {
method: 'post', method: 'post',
body: JSON.stringify( { 'id': seat[ 'id' ], 'eventID': this.event.eventID } ), body: JSON.stringify( { 'id': seat[ 'id' ], 'eventID': this.event.eventID, 'component': seat.component } ),
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'charset': 'utf-8' 'charset': 'utf-8'
} }
}; };
fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options );
res.text().then( text => {
console.log( text );
} );
} );
}, },
standing ( id ) { standing ( id ) {
const d = this.draggables[ id ]; const d = this.draggables[ id ];
@@ -445,47 +446,51 @@
} }
for ( let group in data.data ) { for ( let group in data.data ) {
if ( !this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { if ( data.data[ group ] > 0 ) {
if ( data.data[ group ] > 0 ) { const options = {
const options = { method: 'post',
method: 'post', // TODO: Add correct name here as well once it is working at all
// TODO: Add correct name here as well once it is working at all body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': '', 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' } ),
body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': '', 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' } ), headers: {
headers: { 'Content-Type': 'application/json',
'Content-Type': 'application/json', 'charset': 'utf-8'
'charset': 'utf-8' }
} };
}; fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => {
fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { if ( res.status === 200 ) {
if ( res.status === 200 ) { this.cart[ this.event.eventID ][ '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 };
this.cart[ this.event.eventID ][ '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 ) {
} else if ( res.status === 409 ) { setTimeout( () => {
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' );
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 );
}, 300 ); }
} if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) {
if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { delete this.cart[ this.event.eventID ];
delete this.cart[ this.event.eventID ]; }
}
this.$refs.cart.calculateTotal(); this.$refs.cart.calculateTotal();
localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); localStorage.setItem( 'cart', JSON.stringify( this.cart ) );
} ); } );
} else { } else {
delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; if ( this.cart[ this.event.eventID ] ) {
const options = { if ( this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) {
method: 'post', delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ];
body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID } ), if ( this.cart[ this.event.eventID ] ) {
headers: { if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) {
'Content-Type': 'application/json', delete this.cart[ this.event.eventID ];
'charset': 'utf-8' }
} }
}; const options = {
fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { method: 'post',
res.text().then( text => { body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID, 'component': data.component } ),
console.log( text ); headers: {
} ); 'Content-Type': 'application/json',
} ); 'charset': 'utf-8'
}
};
fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options );
localStorage.setItem( 'cart', JSON.stringify( this.cart ) );
}
} }
} }
} }
@@ -504,8 +509,6 @@
<style scoped> <style scoped>
.parent { .parent {
height: 80vh; height: 80vh;
/* aspect-ratio: 16 / 9; */
/* -webkit-aspect-ratio: 16 / 9; */
width: 70vw; width: 70vw;
top: 17vh; top: 17vh;
left: 5vw; left: 5vw;
@@ -538,7 +541,6 @@
} }
.content-parent { .content-parent {
/* aspect-ratio: 16 / 9; */
width: 400vw; width: 400vw;
height: 400vw; height: 400vw;
} }

View File

@@ -20,7 +20,7 @@
<h4 class="price"><div style="display: inline;" v-if="ticket.count">{{ ticket.count }}x</div> {{ ticket.displayName }}: </h4> <h4 class="price"><div style="display: inline;" v-if="ticket.count">{{ ticket.count }}x</div> {{ ticket.displayName }}: </h4>
</td> </td>
<td> <td>
{{ backend.currency }} {{ ticket.price }} <span class="material-symbols-outlined deleteButton" @click="deleteTicket( ticket.id, event.eventID )" title="Delete ticket">delete</span> {{ backend.currency }} {{ ticket.price }} <span class="material-symbols-outlined deleteButton" @click="deleteTicket( ticket.id, event.eventID, ticket.comp )" title="Delete ticket">delete</span>
</td> </td>
</tr> </tr>
</table> </table>
@@ -114,9 +114,10 @@
} }
} }
}, },
deleteTicket ( ticketID, event ) { deleteTicket ( ticketID, event, component ) {
this.ticketToDelete[ 'event' ] = event; this.ticketToDelete[ 'event' ] = event;
this.ticketToDelete[ 'id' ] = ticketID; this.ticketToDelete[ 'id' ] = ticketID;
this.ticketToDelete[ 'component' ] = component;
this.$refs.popups.openPopup( 'Do you really want to delete this ticket?', {}, 'confirm' ); this.$refs.popups.openPopup( 'Do you really want to delete this ticket?', {}, 'confirm' );
}, },
verifyTicketDelete ( status ) { verifyTicketDelete ( status ) {
@@ -126,6 +127,15 @@
} else { } else {
delete this.cart[ this.ticketToDelete.event ]; delete this.cart[ this.ticketToDelete.event ];
} }
const options = {
method: 'post',
body: JSON.stringify( { 'id': this.ticketToDelete[ 'id' ], 'eventID': this.ticketToDelete[ 'event' ], 'component': this.ticketToDelete[ 'component' ] } ),
headers: {
'Content-Type': 'application/json',
'charset': 'utf-8'
}
};
fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options );
} }
localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); localStorage.setItem( 'cart', JSON.stringify( this.cart ) );
}, },