PageSourceSearch

https://www.cvents.eu/js/fw/seats/api/event-reservation.js

js cvents.eu collected 2026-09-24 19:38:32 UTC 14,517 bytes, 365 lines download raw bytes

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                        '                       &nbsp;' +
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                        '                       &nbsp;' +
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.