VTB Data API
De VTB Data API kan worden gebruikt om een travelplan.json in te laden. De loader biedt een API aan om de data uit het travelplan op een zo eenvoudig mogelijke manier te gebruiken.
Initialisatie
const config: VtbConfig = {
calculate_flight_duration: true
};
new Vtb(config).load('/assets/travelplan.json').then((vtb) => {
console.info(`vtb data loaded: ${vtb.title}`);
});
Properties
.title: string
Geeft de titel van het reisvoorstel
const title = `<h1>${vtb.title}</h1>`;
.subtitle: string
Geeft de subtitel van het reisvoorstel
const subtitle = `<h2>${vtb.subtitle}</h2>`;
.covers: Array<VtbMedia>
Geeft een lijst van VtbMedia objecten welke gebruikt kunnen worden voor het opbouwen van een VtbMediaElement voor bijvoorbeeld een "hero" afbeelding.
Met meerdere covers kan er bijvoorbeeld een hero slider worden opgebouwd.
const cover: VtbMedia = vtb.covers[0];
const mediaElement = new VtbMediaElement();
mediaElement.media = cover;
mediaElement.cover = true;
document.appendChild(mediaElement);
<vtb-media src="..." cover></vtb-media>
.startdate: Dayjs
Geeft de start datum van de reis
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Startdatum:</dt><dd>${vtb.startdate.format('DD MMM YYYY')}</dd>`);
<dl><dt>Startdatum:</dt><dd>15 april 2024</dd></dl>
.enddate: Dayjs
Geeft de terugkomst datum van de reis
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Einddatum:</dt><dd>${vtb.enddate.format('DD MMM YYYY')}</dd>`);
<dl><dt>Einddatum:</dt><dd>26 april 2024</dd></dl>
.duration: number
Geeft de duur in dagen van de reis
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Reisduur:</dt><dd>${vtb.duration} dagen</dd>`);
<dl><dt>Reisduur:</dt><dd>10 dagen</dd></dl>
.days: number
Alias van duration
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Reisduur:</dt><dd>${vtb.days} dagen</dd>`);
<dl><dt>Reisduur:</dt><dd>10 dagen</dd></dl>
.nights: number
Geeft de duur in het aantal nachten van de reis
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Reisduur:</dt><dd>${vtb.nights} nachten</dd>`);
<dl><dt>Reisduur:</dt><dd>9 nachten</dd></dl>
.sales_price: number
Geeft de totaal prijs van de reis (door VTB berekend)
import {currency} from 'vtb-webcomponents/utils/currency.js';
const metadata: HTMLDlElement = document.getElementById('trip-meta-data'); // <dl>
metadata.appendChild(`<dt>Totaal:</dt><dd>${currency(vtb.sales_price)}</dd>`);
<dl><dt>Totaal:</dt><dd>€ 1.995,00</dd></dl>
.has_flightinfo: boolean
Geeft aan of er binnen de reis een of meerdere (al dan niet optionele) vluchten zijn opgenomen.
if (vtb.has_flightinfo) {
// .. do something
}
.flightinfo Array<VtbFlightData>
Geeft een lijst van vluchtelementen (FLightElement) terug
const flight_table = document.getElementById('flight-table');
vtb.flightinfo.each((idx, flight) => {
flight_table.appendChild(`
<tr>
<td>${flight.departure.city} (${flight.departure.IATA})</td>
<td>${flight.departure.date.format('DD MMM')}</td>
<td>${flight.arrival.city} (${flight.arrival.IATA})</td>
<td>${flight.arrival.date.format('DD MMM')}</td>
<td>${flight.flightnumber}</td>
</tr>
`);
});
<table>
<tr>
<td>Amsterdam (AMS)</td>
<td>10 april</td>
<td>New York (JFK)</td>
<td>11 april</td>
<td>KLM987</td>
</tr>
</table>
.flight_info
Alias voor flightinfo
.has_carrental: boolean
Geeft aan of er autohuur in het reisvoorstel is opgenomen
if (vtb.has_carrental) {
// .. do something
}
.carrental: Array<VtbElement>
Geeft een lijst van elementen
.participants: Array<VtbParticipant>
Geeft een lijst van de reizigers binnen het reisvoorstel
.parties: Array<VtbParty>
Geeft een lijst van de binnen het reisvoorstel gedefinieerde reizigersgroepen. Er kunnen meerdere groepen bestaan wanneer er bijvoorbeeld twee bevriende koppels met elkaar op vakantie gaan.
.extra_fields: Dictionary<VtbExtraField>
Geeft een dictionary terug met extra velden uit het reisvoorstel.
Methoden
.load(travelplan_source_url: string): Promise<Vtb>
Laad een travelplan.json bestand van het reisvoorstel en parsed deze data meteen voor gebruik.
const config: VtbConfig = {
calculate_flight_duration: true
};
new Vtb(config).load('/assets/travelplan.json').then((vtb) => {
console.info(`vtb data loaded: ${vtb.title}`);
});
.parse_vtb_data(vtbSrcData: any): void
Wanneer op een andere manier de json wordt ingeladen dan via de
hierboven genoemde .load()
kan de data geparsed worden
via deze methode.
Een voorbeeld via SvelteKit met de json als statische asset waardoor server side rendering / static rendering mogelijk is:
// (sveltekit)
import * as travelplan_data from '$lib/json/travelplan.json';
import {Vtb} from 'vtb-webcomponents';
export function load({params}) {
const vtb = new Vtb({
calculate_flight_duration: false
});
vtb.parse_vtb_data(travelplan_data);
}
.element_groups(): Array<VtbElementGroup>
Geeft alle groepen elementen terug, meestal zijn deze per dag gedefinieerd.
.filter_groups(config: VtbFilterConfig):
Array<VtbElementGroup>
Geeft groepen terug welke voldoen aan het meegegeven filter: VtbFilterConfig
const f: VtbFilterConfig = {
group_type_ids: [SegmentTypes.DEFAULT, SegmentTypes.FLIGHT]
}
const groups = vtb.filter_groups(f);
groups.each((group, idx) => {
// do something with the current group
});
.filter_elements(config: VtbFilterConfig):
Array<VtbElement>
Geeft alle elementen terug welke voldoen aan het meegegeven filter:
const acco_elements: Array<VtbElement> = group.filter_elements({
group_type_ids: [SegmentTypes.DEFAULT],
element_unit_ids: [UnitTypes.ACCO]
});
.calculate_price(config ?: VtbFilterConfig, elements?:
Array<VtbElement>): number
Deze methode berekend de prijs van de elementen uit de meegegeven FilterConfig of de meegegeven elementen. Optionele elementen worden niet meegenomen in de berekening.
// calculate all flight elements
const flights_price = vtb.calculate_price({
group_type_ids: [SegmentTypes.DEFAULT, SegmentTypes.FLIGHT],
element_unit_ids: [UnitTypes.FLIGHT, UnitTypes.FLIGHTNIGHT],
optional: false
} // -> 390,99
utils.currency(flights_price); // € 390,99
.map(container_id: string, filter_config: VtbFilterConfig,
map_options: VtbMapOptions): VtbMapElement
Utility methode om een VTbMapElement weer te geven met de VtbMapElementen die voldoen aan het filter. De VtbMapOptions worden gebruikt voor wel/niet tekenen van verbindingen tussen de punten en als vlucht of over de weg.
const map_options: VtbMapOptions = {
connect_markers: true,
connect_mode: 'flight',
api_key: GOOGLE_MAPS_KEY
};
const map_search: VtbFilterConfig = {
group_type_ids: [SegmentTypes.DEFAULT],
element_unit_ids: [UnitTypes.ACCO],
optional: false
};
vtb.map('complete-map', map_search, map_options);
.flightschedule(container_id: string, filter_config?:
VtbFilterConfig, options: VtbFLightScheduleOptions):
VtbFlightScheduleElement
Utility methode om op basis van een filter config de betreffende vluchten in responsive tabelvorm weer te geven.
const flight_search: VtbFilterConfig = {
group_type_ids: [SegmentTypes.DEFAULT, SegmentTypes.FLIGHT],
element_unit_ids: [UnitTypes.FLIGHT, UnitTypes.FLIGHTNIGHT],
optional: false
};
vtb.flightschedule('flights_table', flight_search, map_options);