This examples demonstrates how to add a marker and keep client side representation in sync with the server side model. Even though you use Google Maps as a Faces component you can still take advantage of the full Google Maps API.
<script src="https://maps.google.com/maps/api/js?key=AIzaSyCvCDkYieuUBmMWon_mfLAfjuaeuosuqow&libraries=marker"></script>
<script>
var currentMarker = null;
function handlePointClick(event) {
if (currentMarker === null) {
document.getElementById('lat').value = event.latLng.lat();
document.getElementById('lng').value = event.latLng.lng();
currentMarker = new google.maps.marker.AdvancedMarkerElement({
position: event.latLng
});
PF('map').addOverlay(currentMarker);
PF('dlg').show();
}
}
function markerAddComplete() {
var title = document.getElementById('title');
currentMarker.title = title.value;
title.value = "";
currentMarker = null;
PF('dlg').hide();
}
function cancel() {
PF('dlg').hide();
currentMarker.map = null;
currentMarker = null;
return false;
}
</script>
<p:growl id="messages" showDetail="true"/>
<div class="card">
<p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" style="width:100%;height:400px"
model="#{addMarkersView.emptyModel}" onPointClick="handlePointClick(event);" widgetVar="map"/>
</div>
<p:dialog widgetVar="dlg" showEffect="fade">
<h:form prependId="false">
<div class="formgrid grid p-fluid">
<div class="field col-12">
<h:outputLabel for="title" value="Title"/>
<p:inputText id="title" value="#{addMarkersView.title}"/>
</div>
</div>
<div class="flex gap-2">
<p:commandButton value="Add" action="#{addMarkersView.addMarker}" update=":messages"
oncomplete="markerAddComplete()"/>
<p:commandButton value="Cancel" onclick="return cancel()"/>
</div>
<h:inputHidden id="lat" value="#{addMarkersView.lat}"/>
<h:inputHidden id="lng" value="#{addMarkersView.lng}"/>
</h:form>
</p:dialog>