Die Web Component <done-generic-map> stellt die gemeinsame destination.one-Karte für externe
Websites bereit. Datenquelle, Kartenverhalten und UI werden über HTML-Attribute oder über die
JavaScript-Properties source und options konfiguriert.
Das Web-Component-Bundle wird einmal in die Host-Seite eingebunden:
<scripttype="module"src="https://newpages.destination.one/web-components.js"data-language="de"data-experience="example"data-template="wlan"></script>
Die Karte belegt immer 100 % der Breite und Höhe ihres Elternelements. Das Elternelement muss deshalb eine berechenbare Höhe besitzen:
<div class="map-container"><done-generic-map source-kind="query" type="Tour,POI"></done-generic-map></div><style>.map-container {width: 100%;height: 600px;}</style>
Ohne eine Höhe am Elternelement hat auch height: 100% der Karte keine sichtbare Höhe.
source-kind bestimmt, woher die Kartendaten stammen.
query | Lädt Marker über eine META-Suchanfrage. Dies ist der Standard. |
items | Zeigt eine vorgegebene Liste von META-Items. |
detail | Zeigt ein primäres Detail-Item und optional Wegpunkte, verwandte und empfohlene Items. Tour- oder Area-Geometrien werden unmittelbar angezeigt. |
location | Zeigt eine feste Position oder lässt den Benutzer eine Position auf der Karte auswählen. Dieser Modus wird über source oder source-json konfiguriert. |
Für eine Query-Quelle stehen folgende Attribute zur Verfügung:
| Attribut | Beschreibung |
|---|---|
type | Kommagetrennte META-Datentypen, zum Beispiel Tour,POI. Standard: All. |
categories | Kommagetrennte Kategorie-IDs. |
features | Kommagetrennte Feature-IDs beziehungsweise Feature-Presets. |
cities | Kommagetrennte Orte. |
keywords | Kommagetrennte Keywords. |
global-ids | Kommagetrennte global_id-Werte als Query-Filter. |
sort | META-Sortierung. |
limit | Maximale Markeranzahl. Ohne Angabe gilt der META-Standard von 12. |
latitude, longitude, radius | Optionaler Umkreisfilter. Die drei Werte müssen gemeinsam gesetzt werden. |
custom-query | Vollständige benutzerdefinierte Query. Wenn gesetzt, hat sie Vorrang vor den übrigen Query-Filtern. |
search-parameters-json | Vollständige META-Suchparameter als JSON-Objekt. |
Mit source-kind="items" kann der WC-Adapter Items anhand ihrer IDs laden:
<done-generic-mapsource-kind="items"global-ids="p_100235769,p_100027802,p_100152965"></done-generic-map>
Alternativ akzeptiert items-json ein JSON-Array vollständiger META-Items. Für dynamische Daten ist
die JavaScript-Property source vorzuziehen.
Der Detailmodus lädt das primäre Item über global-id. Nicht explizit übergebene Wegpunkte,
verwandte und empfohlene Items werden standardmäßig automatisch geladen.
<done-generic-mapsource-kind="detail"type="Tour"global-id="t_100267026"detail-auto-load-items="true"></done-generic-map>
detail-auto-load-items="false" deaktiviert das automatische Nachladen. Vollständige Items können
über item-json, waypoint-items-json, related-items-json und recommendation-items-json oder über die entsprechenden JavaScript-Properties gesetzt werden.
Der feste Modus zeigt einen Marker an der angegebenen Position. Optional wird ein kreisförmiger Radius in Kilometern dargestellt:
map.source = {kind: 'location',mode: 'fixed',position: { lat: 53.1435, lng: 7.3412 },radiusKm: 5,showRadius: true,};
Im Pick-Modus wird der Marker durch einen Kartenklick gesetzt. Die Position wird über das Event location-select ausgegeben:
map.source = {kind: 'location',mode: 'pick',radiusKm: 5,showRadius: true,};
GenericMapOptionsAlle Optionen sind optional. Die Spalte „HTML-Attribut“ zeigt das zugehörige flache Attribut der
Web Component. Bei booleschen Attributen aktiviert sowohl ein leeres Attribut als auch der Wert "true" die Option; zum Deaktivieren wird ausdrücklich "false" gesetzt.
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
map.cluster | map-cluster | true | Fasst nahe Marker zu Cluster-Bubbles zusammen. |
map.userLocation | map-user-latitude, map-user-longitude | nicht gesetzt | Zeigt einen zusätzlichen Standortmarker, ohne damit automatisch den initialen Ausschnitt festzulegen. Das Objekt verwendet { lat, lon }. |
map.overlap.enabled | map-overlap | true | Versetzt Marker, die auf derselben oder fast derselben Position liegen. |
map.overlap.zoomThreshold | map-overlap-zoom-threshold | 14 | Ab diesem Zoomlevel werden überlappende Marker versetzt. |
map.overlap.offsetMeters | map-overlap-offset-meters | 8 | Abstand der versetzten Marker in Metern. |
map.providerOptions.enableCloseControl | map-enable-close-control | false | Zeigt das Close-Control des MapLibre-Providers. |
map.providerOptions.disableStyleSwitcher | map-disable-style-switcher | false | Blendet den Kartenstil-Umschalter aus. |
map.providerOptions.defaultStyle | map-default-style | aktiver META-Kartenstil | Wählt einen Kartenstil anhand seiner ID aus. |
map.providerOptions.style | map-style | URL des aktiven Kartenstils | Setzt direkt eine MapLibre-Style-URL und hat Vorrang vor defaultStyle. |
map.providerOptions.center | map-center-longitude, map-center-latitude | META-Default-View, sonst Deutschland | Initiales Provider-Zentrum als [longitude, latitude], bevor die Viewport-Logik angewendet wird. |
map.providerOptions.zoom | map-zoom | META-Default-View, sonst 9 | Initialer Provider-Zoom, bevor Fit-Bounds angewendet wird. |
map.providerOptions.minZoom | map-min-zoom | MapLibre-Standard | Kleinster erlaubter Zoom. |
map.providerOptions.maxZoom | map-max-zoom | 18 | Größter erlaubter Zoom. |
map.providerOptions.fitBoundsPadding | map-fit-bounds-padding | 100 | Innerer Abstand in Pixeln beim Einpassen von Markern und Geometrien. |
map.providerOptions.customStyles | map-custom-styles-json | Kartenstile aus der META-Konfiguration | Verfügbare Kartenstile als Array mit mindestens id und uri; optional sind title und active. |
map.providerOptions.mapPins | map-pins-json | eingebaute Pin-Registry | Zuordnung von Pin-Namen zu SVG-Strings. Die Platzhalter BGCOLOR und FGCOLOR werden durch die Kartenfarben ersetzt. |
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
viewport.initial | viewport-initial | { mode: 'items' } | Initiale Ausrichtung: items, user oder configured. |
viewport.initial.location | viewport-latitude, viewport-longitude, viewport-zoom | nicht gesetzt | Position für viewport-initial="configured". |
viewport.fitBounds | viewport-fit-bounds | true | Passt beim ersten Rendern den Kartenausschnitt an Marker beziehungsweise Geometrie an. |
viewport.fitOnItemsChange | viewport-fit-on-items-change | true | Passt den Ausschnitt erneut an, wenn sich die übergebenen Items ändern. Benutzergetriebene Query-Reloads unterdrücken dabei unnötige Rücksprünge. |
viewport.detailFit | viewport-detail-fit | Detail: geometry, sonst all | Im Detailmodus: geometry fokussiert die Tour/Area, all berücksichtigt zusätzlich alle sichtbaren Markergruppen. |
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
geometry.detail.tour | geometry-detail-tour | true | Zeigt im Detailmodus die Polyline einer Tour. |
geometry.detail.area | geometry-detail-area | true | Lädt und zeigt im Detailmodus das Polygon einer Area. |
geometry.onPinClick.tour | geometry-on-pin-click-tour | false | Zeigt nach Auswahl eines Tour-Markers dessen Polyline. |
geometry.onPinClick.area | geometry-on-pin-click-area | false | Lädt und zeigt nach Auswahl eines Area-Markers dessen Polygon. |
geometry.directionArrows | geometry-direction-arrows | true | Zeigt Richtungspfeile auf sichtbaren Tour-Polylines. |
Die Geometrien werden aus den META-Items beziehungsweise über die dafür vorgesehenen META-Geometrieanfragen ermittelt. Externes GeoJSON muss nicht erzeugt oder übergeben werden.
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
routing.enabled | routing-enabled | false | Berechnet eine Route zwischen den sichtbaren Items. |
routing.provider | routing-provider | nicht gesetzt | ID des Routing-Providers. Das Feld ist erforderlich, sobald Routing aktiviert ist. |
routing.fromUser | routing-from-user | false | Verwendet den aufgelösten Benutzerstandort als Startpunkt. |
routing.numberedPins | routing-numbered-pins | false | Zeigt die Reihenfolge der Routenziele als Nummern in den Pins. |
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
densityPoints.enabled | density-points-enabled | false | Zeigt Ergebnisdichtepunkte für den sichtbaren Kartenausschnitt. |
densityPoints.searchParameters | density-points-search-parameters-json | Query der Markerquelle ohne Pagination | Überschreibt die Suchparameter der Ergebnisdichtepunkte vollständig. |
Die Query kann über folgende flache Attribute überschrieben werden: density-points-custom-query, density-points-type, density-points-categories, density-points-features, density-points-cities, density-points-keywords und density-points-sort. Ohne explizite Density-Query verwendet eine Query-Quelle automatisch die
Marker-Query; limit und andere Paginationseinstellungen werden dabei entfernt.
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
interactions.initialReloadOnMove | interactions-initial-reload-on-move | false | Aktiviert initial das Nachladen von Query-Ergebnissen nach einer Kartenbewegung. |
interactions.debounceMs | interactions-debounce-ms | 200 | Verzögerung in Millisekunden, bevor eine Kartenbewegung verarbeitet wird. |
Einige Defaults sind vom Datenmodus abhängig. „Detail“ bezeichnet source.kind: 'detail'.
| Optionsfeld | HTML-Attribut | Standard | Beschreibung |
|---|---|---|---|
ui.fullscreen | ui-fullscreen | true | Zeigt das Fullscreen-Control. |
ui.categoryFilter | ui-category-filter | Detail: true, sonst false | Zeigt im Fullscreen die Filter für Wegpunkte, verwandte und empfohlene Items. |
ui.markerDetail | ui-marker-detail | Detail: true, sonst false | Öffnet nach einem Markerklick das eingebaute Detailpanel. |
ui.teaserPopup | ui-teaser-popup | true | Erlaubt Teaser-Popups nach einem Klick auf Ergebnisdichtepunkte. |
ui.teaserSlider | ui-teaser-slider | Detail: true, sonst false | Zeigt im Detailmodus die sichtbare Zusatzgruppe als Teaser-Slider. |
ui.elevationProfile | ui-elevation-profile | Detail: true, sonst false | Aktiviert das Höhenprofil für eine sichtbare Tour. |
ui.elevationPreview | ui-elevation-preview | true | Zeigt außerhalb des Fullscreens eine kompakte, anklickbare Höhenprofil-Vorschau, wenn eine Tour ausgewählt ist. |
ui.fullscreenInsetTop | ui-fullscreen-inset-top | var(--pageheader-height, 0px) | Reserviert oberhalb der Fullscreen-Karte Platz, beispielsweise für einen festen Seitenheader. |
ui.showReloadOnMoveToggle | ui-show-reload-on-move-toggle | false | Zeigt den Schalter „Ergebnisse beim Bewegen der Karte aktualisieren“. |
ui.linkTarget | link-target | _self | Zielkontext der Detail- und Teaserlinks, zum Beispiel _self oder _blank. |
ui.linkDetailBaseUrl | link-detail-base-url | destination.one-Standalone-URL | Basis-URL für externe Detaillinks. Ohne Angabe wird die Standalone-URL aus Sprache, Experience und Template erzeugt. |
ui.linkRouterMode | link-router-mode | history | Form der Links bei eigener Basis-URL: history erzeugt /detail/..., hash erzeugt #/detail/.... Ohne eigene Basis-URL bleibt der Standalone-Link immer im History-Format. |
Die Standardwerte stammen aus den Übersetzungen der konfigurierten Sprache.
| Optionsfeld | HTML-Attribut | Beschreibung |
|---|---|---|
ui.labels.updateResultsOnMove | label-update-results-on-move | Beschriftung des Movement-Reload-Schalters. |
ui.labels.iconStyle | label-icon-style | Zugänglicher Name des Style-Switchers. |
ui.labels.iconMaximize | label-icon-maximize | Zugänglicher Name des Maximieren-Controls. |
ui.labels.iconMinimize | label-icon-minimize | Zugänglicher Name des Minimieren-Controls. |
ui.labels.iconClose | label-icon-close | Zugänglicher Name des Close-Controls. |
ui.labels.fullscreenDialog | label-fullscreen-dialog | Zugänglicher Name des Fullscreen-Dialogs. |
Flache Attribute sind für CMS- und statische HTML-Einbindungen vorgesehen:
<div class="tour-map"><done-generic-map
source-kind="query"
type="Tour"
categories="Wandern,Radtouren"
sort="title"
limit="24"
map-cluster="true"
viewport-fit-bounds="true"
geometry-on-pin-click-tour="true"
geometry-direction-arrows="true"
density-points-enabled="true"
interactions-initial-reload-on-move="false"
ui-fullscreen="true"
ui-marker-detail="true"
ui-teaser-popup="true"
ui-elevation-profile="true"
ui-elevation-preview="true"
ui-show-reload-on-move-toggle="true"
link-target="_self"
></done-generic-map>source-kind="query"type="Tour"categories="Wandern,Radtouren"sort="title"limit="24"map-cluster="true"viewport-fit-bounds="true"geometry-on-pin-click-tour="true"geometry-direction-arrows="true"density-points-enabled="true"interactions-initial-reload-on-move="false"ui-fullscreen="true"ui-marker-detail="true"ui-teaser-popup="true"ui-elevation-profile="true"ui-elevation-preview="true"ui-show-reload-on-move-toggle="true"link-target="_self"></done-generic-map></div><style>.tour-map {width: 100%;height: min(700px, 80vh);}</style>
Komplexe Konfigurationen können alternativ als JSON über source-json und options-json übergeben werden. Für dynamische Daten sind echte JavaScript-Objekte besser geeignet.
Die Properties source und options übernehmen echte Objekte. Das Element wird zuerst in das DOM
eingefügt, damit der Lazy Loader die Web Component registriert. Anschließend wartet der Code auf
die Definition und setzt die Properties:
<div id="map-host"><done-generic-map id="map"></done-generic-map></div><style>#map-host {width: 100%;height: 600px;}</style><script type="module">await customElements.whenDefined('done-generic-map');const map = document.querySelector('#map');map.source = {kind: 'query',searchParameters: {type: 'Tour',category: 'Wandern',limit: 24,sort: 'title',cause: 'newpages.portal',},};map.options = {map: {cluster: true,overlap: {enabled: true,zoomThreshold: 14,offsetMeters: 8,},},viewport: {initial: { mode: 'items' },fitBounds: true,fitOnItemsChange: true,},geometry: {onPinClick: {tour: true,area: true,},directionArrows: true,},densityPoints: {enabled: true,},ui: {fullscreen: true,markerDetail: true,teaserPopup: true,elevationProfile: true,elevationPreview: true,linkTarget: '_self',},};map.addEventListener('marker-click', (event) => {const payload = event.detail[0];console.log('Marker ausgewählt:', payload.item);});map.addEventListener('update:fullscreen', (event) => {console.log('Fullscreen:', event.detail[0]);});</script>
Bei einer dynamischen Änderung wird der Property ein neues Objekt zugewiesen. Das direkte Mutieren eines tief verschachtelten Feldes ist von außen nicht zuverlässig beobachtbar:
map.options = {...map.options,ui: {...map.options.ui,markerDetail: false,},};
Wenn dieselbe Option mehrfach gesetzt ist, gilt folgende Priorität:
optionsoptions-jsonFür die Quelle gilt: source vor source-json vor den flachen Source-Attributen.
Vue Custom Elements geben die Argumente eines Events als Array in CustomEvent.detail aus. Bei den
folgenden Events liegt die Nutzlast daher jeweils in event.detail[0].
| Event | Nutzlast | Bedeutung |
|---|---|---|
ready | { mapId } | Die Kartenlaufzeit ist bereit. |
loaded | MetaItem[] | Die Items der Quelle wurden geladen beziehungsweise übernommen. |
error | string | Konfigurations-, Request- oder Kartenfehler. |
marker-click | { id, item, coordinates } | Ein Marker wurde ausgewählt. |
marker-deselect | { item, coordinates } | Der bereits ausgewählte Marker wurde abgewählt. |
feature-click | { id, item, coordinates } | Allgemeines Feature-Click-Event für Marker. |
density-point-click | { item, coordinates } | Ein Ergebnisdichtepunkt wurde aufgelöst und ausgewählt. |
location-select | { lat, lng } | Der Benutzer hat im Location-Pick-Modus eine Position gewählt. |
viewport-change | { bounds, zoom } | Sichtbarer Kartenausschnitt oder Zoom haben sich geändert. |
update-results | { boundsQuery, bounds } | Bei aktiviertem Movement-Reload sollen Ergebnisse für den neuen Ausschnitt geladen werden. |
reload-on-move-change | boolean | Der Benutzer hat den Movement-Reload-Schalter geändert. |
update:fullscreen | boolean | Der Fullscreen-Zustand hat sich geändert. |
update:activeCategories | string[] | Die aktiven Detail-Kategorien haben sich geändert. |
update:selectedItem | MetaItem | null | Die kontrollierte Markerauswahl hat sich geändert. |
close-request | keine | Das Close-Control fordert den Host zum Schließen der Karte auf. |
Die Zustände fullscreen, active-categories und selected-item sind kontrollierbar. Wenn der Host
einen solchen Wert dauerhaft als Attribut oder Property setzt, muss er auf das zugehörige update:*-Event reagieren und den Wert aktualisieren, damit Benutzeränderungen bestehen bleiben.