Seatmap documentation
Inserting the iframe
<iframe
src="seatmapURL"
ref="scheduleId"
data-schedule-id="scheduleId">
</iframe>
attribute ref
is used to select the iFrame from the client code.
attribute data-schedule-id
is used internally by the seatmap code.
Seatmap URL:
Must have the following structure:
https://{{domain}}.betterez.com/operations/selectable-seatmaps/{{seatMapId}}?routeId={{routeId}}&scheduleId={{scheduleId}}&isBackoffice={{isBackoffice}}&date={{date}}&legFrom={{legFromIndex}}&legTo={{legToIndex}}&
originId={{originId}}&destinationId={{destinationId}}&providerId={{providerId}}&x-api-key={{x-api-key}}
base URL
https://{{domain}}.betterez.com/operations/selectable-seatmaps/
path params
seatMapId
(String) (The Id of the seatmap)
query params
routeId
(String) The Id of the route
scheduleId
(String) The Id of the schedule
date
(String with format YYYY-MM-DD) Date of travel for this trip, may be different than the journey if this is a connecting trip that started the previous day on another schedule
isBackoffice
(Boolean) Should be false
legFrom
(Number) The index in the schedule for the departing station. This index can be found in trip information. Each trip has segments, more than one if it is a connection trip for example, and for each segment in the trip you can find the 'legFrom' field
legTo
(Number) The index in the schedule for the arrival station. This index can be found in trip information. Each trip has segments, more than one if it is a connection trip for example, and for each segment in the trip you can find the 'legTo' field
originId
(String) The id of the departing station
destinationId
(String) The id of the arrival station
providerId
(String) The ID of the provider account
x-api-key
(String) Identify a partner of the provider or the provider itself
ttlSec
(Number) Optional. The expiration time in seconds of a selected seat
Methods/functions needed in client side
All this function must be assigned to the window
object of the parent page for the iFrame.
Accessing the seatmap from the client code.
It's a one liner using the ref
of the iFrame
Iframe and client in same domain:
this.$refs[scheduleId].contentWindow;
#### Iframe and client in **different** domain: ``` document.getElementsByTagName("iframe")[0].contentWindow; // you can use document.getElementById if you add an id to the iframe ```
seatmapReady()
The seatmap in the iframe will call this function and block until this function returns. (Once the function returns the seatmap will be "ready to use").
window.seatmapReady = function () {
// do something to interact with the seatmap or nothing
// This function can be a no-op but it needs to be here
}
You can use this function to prepare the UI of the client or the seatmap in any way you want. Ex: if you are navigating to the seatmap page to "edit" seats already selected by the customer, you should use this function to interact with the seatmap and pre-select the seats for the customer.
For iframe and client in different domain see this section
addSeatToSelectionNew(seatLocationObject, iFrameInformationObject)
The seatmap will call this function when a customer clicks on a seat inside the seatmap.
You need to use this function to "actually" select the seat in the seatmap.
You should check for example if all seats have been assigned already to all customers or any other business restriction that you want to perform.
The seat at this point is not "selected" in the seatmap itself, until the following code is executed.
For iframe and client in same domain do:
const seatmap = this.$refs[scheduleId].contentWindow;
seatmap.selectSeat(seatId);
For iframe and client in different domain do:
const seatmap = document.getElementsByTagName("iframe")[0].contentWindow; // you can use document.getElementById if you add an id to the iframe
seatmap.postMessage({eventName: "selectedSeatFromOtherDomain", seatId: seatLocationObject.seatId}, "*");
Any of this code should be in the body of the `addSeatToSelectionNew` function, see below for each case.
You should also "remember" the seat selection or capture the seat-selection in the client context to send to the API to complete a booking.
With the params recieved by the listener:
Iframe and client in same domain:
window.addSeatToSelectionNew = function (seatLocationObject, iFrameInformationObject) {
const seatmap = this.$refs[scheduleId].contentWindow;
seatmap.selectSeat(seatLocationObject.seatId);
// save the seatLocationObject and iFrameInformationObject in the client context
}
Iframe and client in different domain:
window.addSeatToSelectionNew = function (seatLocationObject, iFrameInformationObject) {
const seatmap = document.getElementsByTagName("iframe")[0].contentWindow; // you can use document.getElementById if you add an id to the iframe
seatmap.postMessage({eventName: "selectedSeatFromOtherDomain", seatId: seatLocationObject.seatId}, "*");
// save the seatLocationObject and iFrameInformationObject in the client context
}
In this case, you should then follow the steps of this section
Parameters:
seatLocationObject
{
seatId // string with the _id of the seat ex: section-5c13c12d062bb938026c3161-row-1-seat-0
sectionId // string with the section _id ex: 5c13c12d062bb938026c3161
rowLabel // string with the name of the row ex: "A"
seatNumber // string with the number of the seat ex: "6"
sectionName // string with the section name ex: "Left"
fee // string with the configured fee Id
}
iFrameInformationObject
{
scheduleId // The id of the schedule, this is particularly useful in the case there are more than one seatmap embedded in the same screen.
}
### Unselecting seats
To unselect seats, you will need to call the seatmap function unSelectSeat
with only one parameter, the seatId.
You could do this, with a function like this:
####Iframe and client in same domain:
function unSelectSeat(scheduleId, seatId) {
const seatmap = this.$refs[scheduleId].contentWindow;
seatmap.unSelectSeat(seatId);
// your code to handle this event in your own environment
}
####Iframe and client in different domain:
function unSelectSeat(seatId) {
const seatmap = document.getElementsByTagName("iframe")[0].contentWindow; // you can use document.getElementById if you add an id to the iframe
seatmap.postMessage({eventName: "unSelectSeatFromOtherDomain", seatId}, "*");
// your code to handle this event in your own environment
}
For iframe and client in different domain see this section
The scheduleId and seatId is something that is already leaving in the client context (you got this information before inside the addSeatToSelectionNew
function)
Using the iframe on a different domain
In order to communicate between client and iframe from different domains the client needs to add the code that will be listening the iframe events, which are two: addSeatToSelectionNew
and seatmapReady
.
This can be acomplished like this:
window.addEventListener("message", function(event) {
if(event.data.eventName === "addSeatToSelectionNew") {
// See (1) below
const {seatLocationObject, iFrameInformationObject} = event.data;
window.addSeatToSelectionNew(seatLocationObject, iFrameInformationObject);
}
if(event.data.eventName === "seatmapReady") {
// See (2) below
window.seatmapReady();
}
if(event.data.eventName === "expiredSeats") {
// do whetever you want using event.data.expired array
}
}, false);
(1) Here the client should call the function window.addSeatToSelectionNew that was created in section addSeatToSelectionNew
(2) Here the client should call the function window.seatmapReady that was created in section seatmapReady