From 84c0017e2ac74d0ed866f707620c72078820f2c0 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Mon, 24 Jul 2023 15:44:24 +0200 Subject: [PATCH] working location settings (incl saving) --- src/server/admin/adminAPIRoutes.js | 4 +- src/server/admin/api/getHandler.js | 14 ++- src/server/admin/api/postHandler.js | 27 +++- src/server/backend/db/data/locations.json | 1 + .../src/components/notifications/popups.vue | 13 +- .../seatplan/userApp/userWindow.vue | 2 +- .../main/src/views/admin/LocationsView.vue | 118 +++++++++++++++--- .../views/admin/events/EventsDetailsView.vue | 21 +++- .../admin/locations/LocationEditView.vue | 88 ------------- 9 files changed, 167 insertions(+), 121 deletions(-) create mode 100644 src/server/backend/db/data/locations.json delete mode 100644 src/webapp/main/src/views/admin/locations/LocationEditView.vue diff --git a/src/server/admin/adminAPIRoutes.js b/src/server/admin/adminAPIRoutes.js index ba4154c..31809e6 100644 --- a/src/server/admin/adminAPIRoutes.js +++ b/src/server/admin/adminAPIRoutes.js @@ -22,7 +22,7 @@ module.exports = ( app ) => { getHandler.handleCall( req.params.call, req.query ).then( data => { res.send( data ); } ).catch( error => { - res.status( 500 ).send( error ); + res.status( error.code ).send( error.error ); } ); } else { res.status( 403 ).sendFile( path.join( __dirname + '/../ui/' + ( req.query.lang ?? 'en' ) + '/errors/403.html' ) ); @@ -34,7 +34,7 @@ module.exports = ( app ) => { postHandler.handleCall( req.params.call, req.body, req.query.lang ).then( data => { res.send( data ); } ).catch( error => { - res.status( 500 ).send( error ); + res.status( error.code ).send( error.error ); } ); } else { res.status( 403 ).sendFile( path.join( __dirname + '/../ui/' + ( req.query.lang ?? 'en' ) + '/errors/403.html' ) ); diff --git a/src/server/admin/api/getHandler.js b/src/server/admin/api/getHandler.js index 33f6b0c..9e8c648 100644 --- a/src/server/admin/api/getHandler.js +++ b/src/server/admin/api/getHandler.js @@ -21,10 +21,10 @@ class GETHandler { if ( Object.keys( data ).length > 0 ) { resolve( data[ 'save' ] ); } else { - reject( 'No data found for this location' ); + reject( { 'code': 400, 'error': 'No data found for this location' } ); } } ).catch( error => { - reject( error ); + reject( { 'code': 500, 'error': error } ); } ); } else if ( call === 'getSeatplanDraft' ) { db.getJSONDataSimple( 'seatplan', query.location ).then( data => { @@ -35,11 +35,19 @@ class GETHandler { resolve( data[ 'save' ] ); } } else { - reject( 'No data found for this location' ); + reject( { 'code': 400, 'error': 'No data found for this location' } ); } } ).catch( error => { reject( error ); } ); + } else if ( call === 'getLocations' ) { + db.getJSONData( 'locations' ).then( data => { + resolve( data ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + } else { + reject( { 'code': 404, 'error': 'Route not found' } ); } } ); } diff --git a/src/server/admin/api/postHandler.js b/src/server/admin/api/postHandler.js index 94da952..a1012a2 100644 --- a/src/server/admin/api/postHandler.js +++ b/src/server/admin/api/postHandler.js @@ -24,15 +24,38 @@ class POSTHandler { db.writeJSONDataSimple( 'seatplan', data.location, dat ).then( resp => { resolve( resp ); } ).catch( error => { - reject( error ); + reject( { 'code': 500, 'error': error } ); } ); } ); } else if ( call === 'saveSeatplan' ) { db.writeJSONDataSimple( 'seatplan', data.location, { 'draft': {}, 'save': data.data } ).then( resp => { resolve( resp ); } ).catch( error => { - reject( error ); + reject( { 'code': 500, 'error': error } ); } ); + } else if ( call === 'saveLocations' ) { + db.getJSONData( 'seatplan' ).then( res => { + let dat = res; + for ( let loc in data.updated ) { + if ( res[ loc ] ) { + dat[ data.updated[ loc ] ] = res[ loc ]; + delete dat[ loc ]; + } + } + db.writeJSONData( 'seatplan', dat ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + + db.writeJSONData( 'locations', data.data ).then( resp => { + resolve( resp ); + } ).catch( error => { + reject( { 'code': 500, 'error': error } ); + } ); + } else { + reject( { 'code': 404, 'error': 'Route not found' } ); } } ); } diff --git a/src/server/backend/db/data/locations.json b/src/server/backend/db/data/locations.json new file mode 100644 index 0000000..055c4f0 --- /dev/null +++ b/src/server/backend/db/data/locations.json @@ -0,0 +1 @@ +{"test2":{"locationID":"test2","name":"TestLocation2","seatplan-enabled":true},"test":{"locationID":"test","name":"TestLocation","seatplan-enabled":true}} \ No newline at end of file diff --git a/src/webapp/main/src/components/notifications/popups.vue b/src/webapp/main/src/components/notifications/popups.vue index 330346c..b516e2f 100644 --- a/src/webapp/main/src/components/notifications/popups.vue +++ b/src/webapp/main/src/components/notifications/popups.vue @@ -15,7 +15,7 @@

{{ data.message }}

- +
@@ -121,6 +121,17 @@ this.data[ 'selected' ] = data; this.closePopup( message ); }, + submitSettings () { + $( '#popup-backdrop' ).fadeOut( 300 ); + const dat = this.data.options; + let ret = {}; + for ( let setting in dat ) { + if ( dat[ setting ][ 'type' ] !== 'link' ) { + ret[ setting ] = dat[ setting ][ 'value' ]; + } + } + this.$emit( 'data', { 'data': ret, 'status': 'settings' } ); + }, openPopup ( message, options, dataType, selected ) { this.data = { 'message': message ?? 'No message defined on method call!!', 'options': options ?? { '1': { 'value': 'undefined', 'displayName': 'No options specified in call' } }, 'selected': selected ?? '' }; this.contentType = dataType ?? 'string'; diff --git a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index 4327637..ac080a8 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -79,7 +79,7 @@ data() { return { draggables: { 1: { 'x': 100, 'y':100, 'h': 100, 'w': 250, 'active': false, 'draggable': true, 'resizable': true, 'id': 1, 'origin': 1, 'shape':'rectangular', 'type': 'seat', 'startingRow': 1, 'seatCountingStartingPoint': 1, 'sector': 'A', 'text': { 'text': 'TestText', 'textSize': 20, 'colour': '#20FFFF' }, 'ticketCount': 1, 'category': 1 } }, - event: { 'name': 'TestEvent2', 'location': 'TestLocation2', 'date': '2023-07-15', 'RoomName': 'TestRoom2', 'currency': 'CHF', 'categories': { '1': { 'price': { '1':25, '2':35 }, 'bg': 'black', 'fg': 'white', 'name': 'Category 1' }, '2': { 'price': { '1':15, '2':20 }, 'bg': 'green', 'fg': 'white', 'name': 'Category 2' } }, 'ageGroups': { '1':{ 'id': 1, 'name':'Child', 'age':'0 - 15.99' }, '2':{ 'id': 2, 'name': 'Adult' } }, 'maxTickets': 2 }, + event: { 'name': 'TestEvent2', 'location': 'TestLocation2', 'date': '2023-07-15', 'currency': 'CHF', 'categories': { '1': { 'price': { '1':25, '2':35 }, 'bg': 'black', 'fg': 'white', 'name': 'Category 1' }, '2': { 'price': { '1':15, '2':20 }, 'bg': 'green', 'fg': 'white', 'name': 'Category 2' } }, 'ageGroups': { '1':{ 'id': 1, 'name':'Child', 'age':'0 - 15.99' }, '2':{ 'id': 2, 'name': 'Adult' } }, 'maxTickets': 2 }, available: { 'redo': false, 'undo': false }, scaleFactor: 1, sizePoll: null, diff --git a/src/webapp/main/src/views/admin/LocationsView.vue b/src/webapp/main/src/views/admin/LocationsView.vue index be754fe..7958f2d 100644 --- a/src/webapp/main/src/views/admin/LocationsView.vue +++ b/src/webapp/main/src/views/admin/LocationsView.vue @@ -15,9 +15,9 @@