mirror of
https://github.com/janishutz/libreevent.git
synced 2025-11-25 21:34:24 +00:00
fix various bugs in seat plan selector
This commit is contained in:
@@ -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' } );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 ) );
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user