{"id":12819,"date":"2024-08-21T17:17:19","date_gmt":"2024-08-21T14:17:19","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=12819"},"modified":"2024-08-26T16:00:09","modified_gmt":"2024-08-26T13:00:09","slug":"create-custom-map-adapter-map-view-dhtmlx-scheduler","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/create-custom-map-adapter-map-view-dhtmlx-scheduler\/","title":{"rendered":"How to Create a Custom Map Adapter for the Map View in DHTMLX Scheduler"},"content":{"rendered":"<p>The Map view is one of 10 customizable options for presenting upcoming events in our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\" rel=\"noopener\" target=\"_blank\">JavaScript scheduling component<\/a>. By default, it allows displaying the list of planned activities on a geographical map from popular map providers such as Google maps, OpenStreetMap and Mapbox. If these default options don\u2019t meet your needs, the latest Scheduler version features the capability to add a custom map adapter to your calendar. <\/p>\n<p>In this tutorial, you will learn how to add the Maptiler library to the Map view of your JavaScript scheduler built with DHTMLX.<\/p>\n<h5>Step-By-Step Guide On Adding a Custom Map Adapter to Scheduler<\/h5>\n<p><a href=\"https:\/\/www.maptiler.com\/\" rel=\"noopener\" target=\"_blank\">MapTiler<\/a> is a powerful map provider that offers customizable and high-quality map tiles used by developers in various projects, including web apps. In the sample below, you can see a JavaScript scheduler with a map view, where you can review all upcoming appointments on the map from MapTiler.<\/p>\n<p><iframe data-src=\"https:\/\/snippet.dhtmlx.com\/jpxplqdb?mode=mobile\" frameborder=\"0\" width=\"100%\" height=\"560\"class=\"snippet-container js-iframe\"><\/iframe> <a href=\"https:\/\/snippet.dhtmlx.com\/jpxplqdb?mode=wide rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>So without further ado, let us explain in detail how to add a similar functionality to your web project.<\/p>\n<h5>Step 1: Initializing Scheduler<\/h5>\n<p>You can initialize DHTMLX Scheduler using the <strong>init<\/strong> method. As a parameter, the method takes an HTML container (or its ID), where the Scheduler will be placed in.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>For more details on the initialization process, check out this documentation <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/initialization.html\" rel=\"noopener\" target=\"_blank\">page<\/a>.<\/p>\n<h5>Step 2: Adding Map View to Scheduler<\/h5>\n<p>Since the Map view is not a default option in Scheduler, you have to add it. You can find all the necessary instructions on this task on this <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/map_view.html#initialization\" rel=\"noopener\" target=\"_blank\">page<\/a>.<\/p>\n<p>So, if you follow the instructions, the default scheduler with the Map view should look like in this <a href=\"https:\/\/snippet.dhtmlx.com\/7qqmkcv3?mode=wide\" rel=\"noopener\" target=\"_blank\">sample<\/a>.<\/p>\n<h5>Step 3: Creating a Custom Map Adapter<\/h5>\n<p>Now, we come to integrating a custom map adapter. For this purpose, you need to create a class that implements the Scheduler map adapter interface, which consists of 9 methods described in this <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/map_view.html#creatingacustommapadapter\" rel=\"noopener\" target=\"_blank\">section<\/a> of our documentation.<\/p>\n<p>These methods represent the main actions that users can perform using the Scheduler\u2019s map view. <\/p>\n<p>To create the Maptiler adapter, use the following code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> maptilerAdapter <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>scheduler<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">map<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">scheduler<\/span> <span class=\"sy0\">=<\/span> scheduler<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; initialize<span class=\"br0\">&#40;<\/span>container<span class=\"sy0\">,<\/span> options<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; maptilersdk.<span class=\"me1\">config<\/span>.<span class=\"me1\">apiKey<\/span> <span class=\"sy0\">=<\/span> options.<span class=\"me1\">accessToken<\/span><span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> map <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> maptilersdk.<span class=\"me1\">Map<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container<span class=\"sy0\">:<\/span> container<span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ container's id or the HTML element in which the SDK will render the map<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style<span class=\"sy0\">:<\/span> maptilersdk.<span class=\"me1\">MapStyle<\/span>.<span class=\"me1\">STREETS<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ style of the map<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; center<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span>options.<span class=\"me1\">initial_position<\/span>.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> options.<span class=\"me1\">initial_position<\/span>.<span class=\"me1\">lat<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ starting position [lng, lat]<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; zoom<span class=\"sy0\">:<\/span> options.<span class=\"me1\">initial_zoom<\/span> <span class=\"co1\">\/\/ starting zoom<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The MapTiler\u2019s map is initialized with the  use of <strong>maptilersdk.Map<\/strong> API, where you specify the <strong>container<\/strong> property with the first parameter of the <strong>initialize()<\/strong> method. The other properties can be used as per your discretion.<\/p>\n<p>Pay attention to the following line of code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">maptilersdk.<span class=\"me1\">config<\/span>.<span class=\"me1\">apikey<\/span> <span class=\"sy0\">=<\/span> options.<span class=\"me1\">accesstoken<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Here, <strong>options.accesstoken<\/strong> refers to your MapTiler API key, which should be set in the <strong>scheduler.config.map_settings.accesstoken<\/strong> config.<\/p>\n<h5>Step 4: Creating Events on Map<\/h5>\n<p>You can enable end-users to add locations of appointments on the map with a double-click. You need to apply the <strong>dblclick<\/strong> event handler to achieve this goal. In this event handler, you should create a scheduler event using the coordinates from the native event object (<strong>e.lnglat.lat<\/strong>, <strong>e.lnglat.lng<\/strong>). In addition, you have to specify the event\u2019s location by sending a request to the specified geocode.<\/p>\n<p>Here&#8217;s an example of how this can be implemented:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">map.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;dblclick&quot;<\/span><span class=\"sy0\">,<\/span>async <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; let response <span class=\"sy0\">=<\/span> await fetch<span class=\"br0\">&#40;<\/span>`https<span class=\"sy0\">:<\/span><span class=\"co1\">\/\/api.maptiler.com\/geocoding\/${e.lngLat.lng},${e.lngLat.lat}.json?key=${options.accessToken}`).then(response =&gt; response.json());<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>response.<span class=\"me1\">features<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; let address <span class=\"sy0\">=<\/span> response.<span class=\"me1\">features<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">place_name_en<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">addEventNow<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lat<span class=\"sy0\">:<\/span> e.<span class=\"me1\">lngLat<\/span>.<span class=\"me1\">lat<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lng<span class=\"sy0\">:<\/span> e.<span class=\"me1\">lngLat<\/span>.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event_location<span class=\"sy0\">:<\/span> address<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start_date<span class=\"sy0\">:<\/span> scheduler.<span class=\"me1\">getState<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">date<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end_date<span class=\"sy0\">:<\/span> scheduler.<span class=\"me1\">date<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span>scheduler.<span class=\"me1\">getState<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">date<\/span><span class=\"sy0\">,<\/span> scheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">time_step<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;minute&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; console.<span class=\"me1\">error<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;unable receive a position of the event&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h5>Step 5: Displaying Events on Map with Markers<\/h5>\n<p>Now, it is time to show you the possibility of displaying upcoming events in your calendar with special markers. Under the hood, you can work with markers using several methods such as <strong>addEventMarker(event)<\/strong>, <strong>removeEventMarker(eventId)<\/strong>, <strong>updateEventMarker(event)<\/strong>, and <strong>clearEventMarkers()<\/strong>.<\/p>\n<p>In our scenario, it works the following way:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"javascript codecolorer\">addEventMarker<span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; let config <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; event.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; event.<span class=\"me1\">lat<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>event.<span class=\"me1\">lat<\/span> <span class=\"sy0\">||<\/span> <span class=\"sy0\">!<\/span>event.<span class=\"me1\">lng<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; config <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lat<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ create the popup<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> popup <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> maptilersdk.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> offset<span class=\"sy0\">:<\/span> <span class=\"nu0\">25<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">setHTML<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">scheduler<\/span>.<span class=\"me1\">templates<\/span>.<span class=\"me1\">map_info_content<\/span><span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ create the marker<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> marker <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> maptilersdk.<span class=\"me1\">Marker<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">setLngLat<\/span><span class=\"br0\">&#40;<\/span>config<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">setPopup<\/span><span class=\"br0\">&#40;<\/span>popup<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">addTo<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">map<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ create the tooltip<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> tooltip <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> maptilersdk.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; closeButton<span class=\"sy0\">:<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; closeOnClick<span class=\"sy0\">:<\/span> <span class=\"kw2\">false<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> markerInfo <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span>event<span class=\"sy0\">,<\/span> marker<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ we need to collect all markers in order to find the required one when we will ipdate or delete it<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">push<\/span><span class=\"br0\">&#40;<\/span>markerInfo<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\nremoveEventMarker<span class=\"br0\">&#40;<\/span>eventId<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span>let i <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\">&lt;<\/span> <span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">length<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>eventId <span class=\"sy0\">==<\/span> <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">event<\/span>.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">splice<\/span><span class=\"br0\">&#40;<\/span>i<span class=\"sy0\">,<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class=\"sy0\">--;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\nupdateEventMarker<span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span>let i <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\">&lt;<\/span> <span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">length<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">event<\/span>.<span class=\"me1\">id<\/span> <span class=\"sy0\">==<\/span> event.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">event<\/span> <span class=\"sy0\">=<\/span> event<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>event.<span class=\"me1\">lat<\/span> <span class=\"sy0\">||<\/span> <span class=\"sy0\">!<\/span>event.<span class=\"me1\">lng<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">setLngLat<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lat<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">setLngLat<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>event.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> event.<span class=\"me1\">lat<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\nclearEventMarkers<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span>let i <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\">&lt;<\/span><span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">length<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>All of these methods should include a simple storage system for the created markers, allowing for easy updating and deleting of markers from the map. In our case, it is done with the <strong>this._markers<\/strong> array, which stores the information about the markers and associated events.<\/p>\n<p>To display a marker on the map when events are clicked on in the grid area, you should utilize the <strong>onEventClick(event)<\/strong> function. In code, it is implemented as follows:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">onEventClick<span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ move to the marker on the map when the event is clicked in the description area<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>._markers <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">length<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span>let i <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> i <span class=\"sy0\">&lt;<\/span> &nbsp;<span class=\"kw1\">this<\/span>._markers.<span class=\"me1\">length<\/span><span class=\"sy0\">;<\/span> i<span class=\"sy0\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> popup <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">getPopup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>popup.<span class=\"me1\">isOpen<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; popup.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>event.<span class=\"me1\">id<\/span> <span class=\"sy0\">==<\/span> &nbsp;<span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">event<\/span>.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>._markers<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span>.<span class=\"me1\">marker<\/span>.<span class=\"me1\">togglePopup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>event.<span class=\"me1\">lat<\/span> <span class=\"sy0\">&amp;&amp;<\/span> event.<span class=\"me1\">lng<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">setView<\/span><span class=\"br0\">&#40;<\/span>event.<span class=\"me1\">lat<\/span><span class=\"sy0\">,<\/span> event.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">zoom_after_resolve<\/span> <span class=\"sy0\">||<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">initial_zoom<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">setView<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lat<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">error_position<\/span>.<span class=\"me1\">lng<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">zoom_after_resolve<\/span> <span class=\"sy0\">||<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">options<\/span>.<span class=\"me1\">initial_zoom<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h5>Step 6: Adjusting Map View Display<\/h5>\n<p>The MapTiler&#8217;s API allows for precise control over the map\u2019s display. For instance, you can use the <strong>setView(latitude, longitude, zoom)<\/strong> method to adjust the view of the map to a certain location determined by the latitude and longitude coordinates, along with the desired zoom level. As a result, you set the required map\u2019s focus, ensuring that end-users can easily view and interact with the relevant geographical information.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">setView<span class=\"br0\">&#40;<\/span>latitude<span class=\"sy0\">,<\/span> longitude<span class=\"sy0\">,<\/span> zoom<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">this<\/span>.<span class=\"me1\">map<\/span>.<span class=\"me1\">setCenter<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>longitude<span class=\"sy0\">,<\/span> latitude<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">this<\/span>.<span class=\"me1\">map<\/span>.<span class=\"me1\">setZoom<\/span><span class=\"br0\">&#40;<\/span>zoom<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The scheduler automatically sets the default location for the event specified in the <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_map_settings_config.html\" rel=\"noopener\" target=\"_blank\">config<\/a>, if the database doesn&#8217;t store the event&#8217;s coordinates. So there should be the <strong>resolveAddress(string)<\/strong> method which gets the <strong>position(lng, lat)<\/strong> of the event from the <strong>event.location<\/strong> property by sending a request to the specified geocode. <\/p>\n<p>This is how it should be implemented:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">async resolveAddress<span class=\"br0\">&#40;<\/span>string<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ get the position(lng,lat) of the event from event.location if the event doesn't have event.lat or event.lng<\/span><br \/>\n&nbsp; &nbsp; let response <span class=\"sy0\">=<\/span> await fetch<span class=\"br0\">&#40;<\/span>`https<span class=\"sy0\">:<\/span><span class=\"co1\">\/\/api.maptiler.com\/geocoding\/${string}.json?key=${this.options.accessToken}`).then(response =&gt; response.json());<\/span><br \/>\n&nbsp; &nbsp; let position <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>response <span class=\"sy0\">&amp;&amp;<\/span> response.<span class=\"me1\">features<\/span>.<span class=\"me1\">length<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; position.<span class=\"me1\">lng<\/span> <span class=\"sy0\">=<\/span> response.<span class=\"me1\">features<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">center<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; position.<span class=\"me1\">lat<\/span> <span class=\"sy0\">=<\/span> response.<span class=\"me1\">features<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">center<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; console.<span class=\"me1\">error<\/span><span class=\"br0\">&#40;<\/span>`Unable recieve a position of the event<span class=\"st0\">'s location: ${string}`);<br \/>\n&nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; return position;<br \/>\n}<\/span><\/div><\/div>\n<p>The <strong>destroy()<\/strong> method is used to delete the map instance:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">destroy<span class=\"br0\">&#40;<\/span>container<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">map<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; while <span class=\"br0\">&#40;<\/span>container.<span class=\"me1\">firstChild<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;container.<span class=\"me1\">firstChild<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; container.<span class=\"me1\">innerHTML<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>All in all, maptilerAdapter.js should contain 9 methods to function correctly as described above.<\/p>\n<h5>Step 7: Adding the New Map Adapter to Scheduler<\/h5>\n<p>The final step is to add the new map adapter to your JS scheduling calendar. To do that, you need to import the module and add the adapter to <strong>scheduler.ext.mapView.adapters<\/strong>, specifying its name in the <strong>scheduler.config.map_view_provider<\/strong> configuration. As a result, the schedulers configuration  will look like this:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">header<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;day&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;week&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;month&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;map&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;date&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;prev&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;today&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;next&quot;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ activate the Map view extension<\/span><br \/>\nscheduler.<span class=\"me1\">plugins<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; map_view<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">ext<\/span>.<span class=\"me1\">mapView<\/span>.<span class=\"me1\">adapters<\/span>.<span class=\"me1\">maptiler<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> maptilerAdapter<span class=\"br0\">&#40;<\/span>scheduler<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ add new adapter to the extension<\/span><br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">map_view_provider<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;maptiler&quot;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ specify the map provider<\/span><br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">map_settings<\/span>.<span class=\"me1\">accessToken<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;8alNOUBUrHjEje2Qmkfc&quot;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ specify the MapTiler API key.<\/span><br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">map_settings<\/span>.<span class=\"me1\">initial_zoom<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">8<\/span><span class=\"sy0\">;<\/span> <br \/>\n<br \/>\nscheduler.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">map_tab<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Map&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">section_location<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Location&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">xy<\/span>.<span class=\"me1\">map_date_width<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">180<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ date column width<\/span><br \/>\nscheduler.<span class=\"me1\">xy<\/span>.<span class=\"me1\">map_description_width<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">400<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ description column width<\/span><br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">map_start<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2019<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">map_end<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2025<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">9<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">lightbox<\/span>.<span class=\"me1\">sections<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;description&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">50<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;textarea&quot;<\/span><span class=\"sy0\">,<\/span> focus<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;location&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">43<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;textarea&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;time&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">72<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;time&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;auto&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'scheduler_here'<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2024<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;map&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> mapEvents <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">278<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-07-22 12:10:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-07-22 12:15:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Sudan&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Janub Kurdufan, Sudan&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lat&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">7.7172005929348435<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lng&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">387.9898595809937<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">285<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-08-01 02:40:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-08-01 15:05:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Ships&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Australia&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lat&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">28.08958685494885<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lng&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">513.4549713134767<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">286<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-09-15 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-09-15 00:05:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Argentina&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Argentina&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lat&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">33.288010117378505<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lng&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">293.6837553977967<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">90<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-09-16 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-09-16 00:05:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Berlin&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Berlin&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lat&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">52.523403<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lng&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">13.411400<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">268<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-07-22 11:35:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2024-07-22 11:40:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Brazil&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;event_location&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Brazil&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lat&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">15.813189304438533<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;lng&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">47.91412353515626<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span>mapEvents<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>These are the main steps that will allow you to integrate a custom map adapter based on MapTiler to your JavaScript scheduling calendar like in our <a href=\"https:\/\/snippet.dhtmlx.com\/jpxplqdb?mode=wide\" rel=\"noopener\" target=\"_blank\">sample<\/a>.<\/p>\n<h5>Conclusion<\/h5>\n<p>The Map view in DHTMLX Scheduler offers a geographical perspective on event scheduling. With the ability to add custom map adapters, the Map view in our JS scheduling component provides greater flexibility in selection of map options that best suits the project\u2019s needs. If you are new to DHTMLX Scheduler but need a comprehensive scheduling tool with multiple views for your project, including the map view, download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a>.<\/p>\n<h5>Related Materials<\/h5>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/samples\/?sample=%2701_initialization_loading\/01_basic_init.html%27&#038;filter=%27%27\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/blog\/tutorials\/?tag=dhtmlxscheduler\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler tutorials<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" rel=\"noopener\" target=\"_blank\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The Map view is one of 10 customizable options for presenting upcoming events in our JavaScript scheduling component. By default, it allows displaying the list of planned activities on &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":12825,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,1],"tags":[33,15],"class_list":["post-12819","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-uncategorized","tag-all-posts","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12819","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/101014"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=12819"}],"version-history":[{"count":5,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12819\/revisions"}],"predecessor-version":[{"id":12851,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12819\/revisions\/12851"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/12825"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=12819"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=12819"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=12819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}