1/** 2 * @package ticket-reservation 3 */ 4 5/** 6 * The EventReservationAPI provides function for creating and releasing seat or block reservations 7 * @type {Function} 8 */ 9var EventReservationAPI = (function($, console) { 10 "use strict"; 11 12 /** 13 * @param {any} reservationControllerUrls 14 * @param minicart 15 * @param reservationCountdown 16 * @constructor 17 */ 18 function EventReservationAPI(reservationControllerUrls, minicart, reservationCountdown) { 19 this.reservationControllerUrls = reservationControllerUrls; 20 this.minicart = minicart; 21 this.reservationCountdown = reservationCountdown; 22 this.instance = this; 23 console.log("EventReservationAPI initialized", reservationControllerUrls); 24 } 25 26 /** 27 * 28 * @return {Deferred} 29 * @param seatObjects 30 * @param ticketTypes 31 * @param seatingPlanId 32 * @param channelId 33 */ 34 EventReservationAPI.prototype.addSeatToCart = function(seatObjects, ticketTypes, seatingPlanId, channelId) { 35 const deferred = $.Deferred(); 36 const instance = this; 37 const reservedSeats = []; 38 console.table(seatObjects); 39 seatObjects.forEach((seat, index) => { 40 const ticketType = ticketTypes[index]; 41 const isMultiLevelPricing = seat.selectedTicketType !== undefined; 42 // FIXME: could be a problem, added but not remember why, could be a second object type but dont know which 43 // const isGeneralAdmission = seat.objectType === "GeneralAdmissionArea" || seat.objectType === "GeneralAdmissionArea"; 44 const isGeneralAdmission = seat.objectType === "GeneralAdmissionArea"; 45 const displayedLabel = this.buildDisplayLabel(seat); 46 const reservationObject = { 47 "id": seat.id, 48 "uuid": seat.uuid, 49 "displayedLabel": displayedLabel, 50 "objectType": seat.objectType, 51 "categoryKey": seat.category.key, 52 "isMultiLevelPricing": isMultiLevelPricing, 53 "isGeneralAdmission": isGeneralAdmission, 54 "gaNumSelected": seat.numSelected, 55 "selectedTicketType": ticketType ? ticketType.ticketType : undefined 56 }; 57 reservedSeats.push(reservationObject); 58 }); 59 console.log("reservedSeats", reservedSeats); 60 const holdToken = seatObjects[0].chart.holdToken; 61 62 const seatData = { 63 "reservedSeats": reservedSeats, 64 "holdToken": holdToken, 65 "seatingPlanId": seatingPlanId, 66 "channelId": channelId 67 }; 68 69 console.log("Add seat reservation", seatData); 70 71 $.ajax({ 72 method: "POST", 73 url: this.reservationControllerUrls.addReservationAction, 74 data: seatData, 75 dataType: "json", 76 cache: false 77 }).done(function (result) { 78 instance.updateMinicart(); 79 deferred.resolve(result); 80 }).fail(function (result) { 81 deferred.reject(result.responseJSON); 82 }); 83 84 return deferred.promise(); 85 }; 86 87 EventReservationAPI.prototype.buildDisplayLabel = function(seatObject) { 88 // 'Seat' 'Booth' 'Table' 'GeneralAdmissionArea' 89 const objectType = seatObject.objectType; 90 let ownLabel = seatObject.labels.own; 91 const section = seatObject.labels.section; 92 93 if(objectType === "Seat") { 94 const seatTranslation = this.getSeatTranslation(seatObject.displayObjectType); 95 ownLabel = seatTranslation + " " + ownLabel; 96 const parentLabel = seatObject.labels.parent; 97 if(parentLabel) { 98 const parentType = seatObject.parent.type; 99 if(parentType === "row") { 100 ownLabel = "Reihe " + parentLabel + ", " + ownLabel; 101 } else { 102 ownLabel = parentLabel + ", " + ownLabel; 103 } 104 } 105 } 106 107 let label = ""; 108 if (section) { 109 label += section + ", "; 110 } 111 label += ownLabel; 112 113 return label; 114 115 }; 116 117 EventReservationAPI.prototype.getSeatTranslation = function(displayObjectType) { 118 switch (displayObjectType) { 119 case "stool": 120 return "Hocker"; 121 case "bench": 122 return "Bank"; 123 case "chair": 124 return "Stuhl"; 125 default: 126 return "Sitz"; 127 } 128 }; 129 130 /** 131 * 132 * @return {Deferred} 133 * @param seatObjects 134 * @param ticketTypes 135 * @param seatingPlanId 136 */ 137 EventReservationAPI.prototype.removeSeatFromCart = function(seatObjects, ticketTypes, seatingPlanId) { 138 const deferred = $.Deferred(); 139 const instance = this; 140 141 const reservedSeats = [];
142 seatObjects.forEach((seat, index) => { 143 const ticketType = ticketTypes[index]; 144 const isMultiLevelPricing = ticketType !== null; 145 const isGeneralAdmission = seat.selectedTicketType === "GeneralAdmissionArea"; 146 const reservationObject = { 147 "id": seat.id, 148 "uuid": seat.uuid, 149 "displayedLabel": seat.labels.displayedLabel, 150 "objectType": seat.objectType, 151 "categoryKey": seat.category.key, 152 "isMultiLevelPricing": isMultiLevelPricing, 153 "isGeneralAdmission": isGeneralAdmission, 154 "selectedTicketType": ticketType ? ticketType.ticketType : undefined, 155 // "selectionPerTicketType": seat.selectionPerTicketType, 156 }; 157 reservedSeats.push(reservationObject); 158 }); 159 const holdToken = seatObjects[0].chart.holdToken; 160 161 const seatData = { 162 "reservedSeats": reservedSeats, 163 "holdToken": holdToken, 164 "seatingPlanId": seatingPlanId 165 }; 166 167 console.log("Remove seat reservation", seatData); 168 169 $.ajax({ 170 method: "DELETE", 171 url: this.reservationControllerUrls.removeReservationAction, 172 data: seatData, 173 dataType: "json", 174 cache: false 175 }).done(function (responseObject) { 176 instance.updateMinicart(); 177 deferred.resolve(responseObject); 178 }).fail(function (result) { 179 deferred.reject(result.responseJSON); 180 }); 181 182 return deferred.promise(); 183 }; 184 185 EventReservationAPI.prototype.updateMinicart = function() { 186 187 const miniCart = this.minicart; 188 const reservationCountdown = this.reservationCountdown; 189 190 setTimeout(function () { 191 192 // minicart may be absent: the header cart button was removed (new checkout) 193 if (miniCart) { 194 miniCart.update(); 195 } 196 reservationCountdown.checkReservationStatus(); 197 198 }, 900); 199 200 }; 201 202 EventReservationAPI.prototype.startSession = function(holdToken, workspaceKey, eventId, currency) { 203 const deferred = $.Deferred(); 204 205 const seatData = { 206 "holdToken": holdToken, 207 "workspaceKey": workspaceKey, 208 "eventId": eventId, 209 "currency": currency 210 }; 211 console.log("Start session", seatData); 212 213 $.ajax({ 214 method: "POST", 215 url: this.reservationControllerUrls.startSessionAction, 216 data: seatData, 217 dataType: "json", 218 cache: false 219 }).done(function (responseObject) { 220 deferred.resolve(responseObject); 221 }).fail(function (result) { 222 deferred.reject(result.responseJSON); 223 }); 224 225 return deferred.promise(); 226 227 }; 228 229 EventReservationAPI.prototype.endSession = function() { 230 const deferred = $.Deferred(); 231 const instance = this; 232 233 console.log("Remove seat reservation"); 234 235 $.ajax({ 236 method: "DELETE", 237 url: this.reservationControllerUrls.endSessionAction, 238 dataType: "json", 239 cache: false 240 }).done(function (responseObject) { 241 instance.updateMinicart(); 242 deferred.resolve(responseObject); 243 }).fail(function (result) { 244 deferred.reject(result.responseJSON); 245 }); 246 247 return deferred.promise(); 248 249 }; 250 251 EventReservationAPI.prototype.getFreeTickets = function(workspaceKey, seatsIoEventKey) { 252 const deferred = $.Deferred(); 253 const instance = this; 254 // fetch data and wait for response 255 $.ajax({ 256 method: "GET", 257 url: this.reservationControllerUrls.freeSeatsAction, 258 data: { 259 workspaceKey: workspaceKey, 260 eventKey: seatsIoEventKey 261 }, 262 dataType: "json", 263 cache: false 264 }).done(function (responseObject) { 265 deferred.resolve(responseObject); 266 }).fail(function (result) { 267 deferred.reject(result.responseJSON); 268 }); 269 270 return deferred.promise(); 271 }; 272 273 EventReservationAPI.prototype.printFreeTickets = function(workspaceKey, seatsIoEventKey, basicTicketData, unavailableCategories, activeSeats = true) { 274 this.getFreeTickets(workspaceKey, seatsIoEventKey).done(function (responseObject) { 275 //Move unavailable categories to notForSale
276 unavailableCategories.forEach(category => { 277 if (responseObject.available[category]) { 278 responseObject.notForSale[category] = responseObject.available[category]; 279 delete responseObject.available[category]; 280 } 281 }); 282 283 console.log("responseObject", responseObject); 284 const freeTickets = activeSeats ? responseObject.available : responseObject.notForSale; 285 286 const printElement = jQuery('<div id="ticket-print">').css({ 287 'text-align': 'center', 288 'width': '19cm' 289 }).append('<style>' + 290 '.wrapSeat { font-family: Arial, Helvetica, sans-serif; text-align: center; vertical-align: top; color: #000000; width: 19cm; height: 6.925cm; }' + 291 '</style>'); 292 293 const elementsList = jQuery('<div>'); 294 295 let totatlCount = 0; 296 Object.entries(freeTickets).forEach(([categoryKey, categorySeats]) => { 297 categorySeats.forEach(seat => { 298 totatlCount++; 299 elementsList.append( 300 '<table class="wrapSeat" border="0" cellspacing="0" cellpadding="0">'+ 301 ' <tr>' + 302 ' <td >' + 303 ' <table width="100%" border="0" cellspacing="0" cellpadding="0">' + 304 ' <tr>' + 305 ' <td width="30%">' + 306 ' ' + 307 ' </td>' + 308 ' <td width="40%" align="center" style="padding-bottom:15px">' + 309 ' <img src="' + basicTicketData.organizerImage + '" alt="Organizer Image" style="height: 40px; width: auto">' + 310 ' </td>' + 311 ' <td width="30%" align="right" style="padding-bottom:15px">' + 312 ' ' + 313 ' </td>' + 314 ' </tr>' + 315 ' </table>' + 316 ' <table width="100%" style="border: 3px solid #000;" cellspacing="0" cellpadding="10" >' + 317 ' <tr>' + 318 ' <td align="center" style="padding:10px">' + 319 ' <span style="font-size:18pt; text-transform: uppercase;"><b>' + basicTicketData.productName + '</b></span><br>' + 320 ' <span style="font-size:14pt; line-height: 8pt;">' + basicTicketData.dateAndCity + '</span>' + 321 ' </td>' + 322 ' </tr>' + 323 ' </table>' + 324 ' <table width="100%" border="0" cellspacing="0" cellpadding="0" style="margin-top:15px;">' + 325 ' <tr>' + 326 ' <td align="left" valign="top" width="25%">' + 327 ' <span style="font-size:26pt; text-transform: uppercase;"><b>' + basicTicketData.translations.ticketTranslation + '</b></span><br>' + 328 ' </td>' + 329 ' <td align="left" valign="top" width="75%">' + 330 ' <span style="font-size:10pt;"><b>' + basicTicketData.translations.categoryTranslation + '</b></span><br>' + 331 ' <span style="font-size:14pt;">' + seat.category + '</span><br>' + 332 ' <span style="font-size:18pt; line-height: 10pt;"><b>' + seat.displayName + '</b></span>' + 333 ' </td>' + 334 ' </tr>' + 335 ' </table>' + 336 ' </td>' + 337 ' </tr>' + 338 '</table>' 339 ); 340 }); 341 }); 342 343 const summaryTable = jQuery( 344 '<table width="100%" border="0" cellspacing="0" cellpadding="0" style="margin-top:15px;">' + 345 '<tr><td>' + basicTicketData.translations.quantityTranslation + ': ' + totatlCount + '</td></tr>' + 346 '</table>' 347 ); 348 349 printElement.append(summaryTable); 350 printElement.append(elementsList); 351 352 printElement.print({ 353 globalStyles : true, 354 mediaPrint : false, 355 deferred: jQuery.Deferred().done(function() { 356 console.log('Printing done', arguments); 357 printElement.remove(); // Delete the virtual element 358 }) 359 }); 360 }); 361 }; 362 363 return EventReservationAPI; 364 365}(window.jQuery, window.console));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.