{"id":4199,"date":"2017-08-18T18:54:52","date_gmt":"2017-08-18T14:54:52","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=4199"},"modified":"2024-02-16T09:26:18","modified_gmt":"2024-02-16T06:26:18","slug":"zoom-the-scheduling-area-dhtmlx-scheduler","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/zoom-the-scheduling-area-dhtmlx-scheduler\/","title":{"rendered":"Zooming through Time with DHTMLX Scheduler"},"content":{"rendered":"<p>Hello, guys! Are you looking for another way to make your scheduling apps handier? In case you are, I\u2019ll show you how to zoom in and out of timelines in <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\" target=\"_blank\" rel=\"noopener noreferrer\">DHTMLX Scheduler<\/a> just like you do it while viewing maps.<\/p>\n<p>I\u2019ll guide you through implementing zoom in Scheduler. This will let your end-users choose the types of the time scale and easily switch between them by a single turn of a mouse wheel. In the end, you\u2019ll create a scheduler like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/08\/step04c.gif\" alt=\"zoom the scheduling area\" \/><\/p>\n<p>It zooms through time and it\u2019s blue, just like the Tardis, isn\u2019t it? Well, are you sitting comfortably? Then I&#8217;ll begin.<\/p>\n<h2>Creating Timelines<\/h2>\n<p>First of all, you need to include the necessary files and create a container for Scheduler on the page. If you are new to DHTMLX Scheduler, read a tutorial on <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/howtostart_guides.html\" target=\"_blank\" rel=\"noopener noreferrer\">how to create a scheduler on a page<\/a>.<\/p>\n<p>Next, initialize Scheduler and parse the data (here I have the data in the JSON format, but other formats are as well possible):<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" 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=\"sy0\">,<\/span><span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2017<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">7<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">16<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">&quot;week&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span>sched_data<span class=\"sy0\">,<\/span><span class=\"st0\">&quot;json&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>When you do this, you\u2019ll have a scheduler like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/08\/step1.png\" alt=\"zoom the scheduling view\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/0vuj015j?mode=wide\" target=\"_blank\" rel=\"noopener noreferrer\">Live demo >><\/a><\/p>\n<p>Looks pretty confusing, too many things seem to happen at the same time. That\u2019s why you need timelines: they help structure events. Suppose you want to distribute events that are to be held in different places. Define them:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> sections<span class=\"sy0\">=<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Room A&quot;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span><span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Room B&quot;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span><span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Room C&quot;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Let\u2019s create three configurations of the same timeline with different zooming levels: month, week and day. Here is the month level:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;timeline1&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;month&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%M&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; y_unit<span class=\"sy0\">:<\/span> sections<span class=\"sy0\">,<\/span><br \/>\n&nbsp; y_property<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;section_id&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; render<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;bar&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The other two levels are created by analogy, but with different x-scales:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;timeline2&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp;<br \/>\n&nbsp; x_unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;day&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%M %d&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;timeline3&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;hour&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%H:%i&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now let\u2019s add tabs for the different zooming levels:<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">id<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_container&quot;<\/span> <span class=\"kw3\">style<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;width:100%;height:100%&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_navline&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; ...<br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"kw2\">div<\/span> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><br \/>\n&nbsp; ...<br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">div<\/span>&gt;<\/span><\/div><\/div>\n<p>Good. Next, add the tab names before the initialization:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">timeline1_tab<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Month&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">timeline2_tab<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Week&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">timeline3_tab<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Day&quot;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now zooming levels are in place and I can add the final stroke for this step. Let\u2019s change the initialization a bit (you can initialize with any zooming level, while I\u2019ve chosen &#8220;month&#8221;):<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">fix_tab_position<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span><span class=\"sy0\">,<\/span><span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2017<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">7<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">17<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">&quot;timeline1&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Note that in the first line I disabled the default position of tabs so that zooming tabs could take the position of the usual ones.<\/p>\n<p>At this stage you\u2019ll have a scheduler like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/08\/step2.png\" alt=\"zoom timeline in scheduler\" \/><\/p>\n<p>Still doesn\u2019t look right, though you can switch between the views by clicking the tab buttons. Let\u2019s configure our timelines.<\/p>\n<h2>Configuring Timelines<\/h2>\n<p>Let\u2019s define additional properties that will help to display the scales right:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n&nbsp; x_step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_size<span class=\"sy0\">:<\/span> <span class=\"nu0\">12<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n&nbsp; x_step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_size<span class=\"sy0\">:<\/span> <span class=\"nu0\">7<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nscheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n&nbsp; x_step<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_size<span class=\"sy0\">:<\/span> <span class=\"nu0\">8<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; x_length<span class=\"sy0\">:<\/span> <span class=\"nu0\">12<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Besides, let\u2019s define the starting points for every zooming level. Without them, you might find yourself in quite unexpected time periods after every switch:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">date<\/span>.<span class=\"me1\">timeline1_start<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span>date.<span class=\"me1\">getFullYear<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">date<\/span>.<span class=\"me1\">timeline2_start<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span>date.<span class=\"me1\">getFullYear<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> date.<span class=\"me1\">getMonth<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> date.<span class=\"me1\">getDate<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> date.<span class=\"me1\">getDay<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nscheduler.<span class=\"me1\">date<\/span>.<span class=\"me1\">timeline3_start<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span>date.<span class=\"me1\">getFullYear<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> date.<span class=\"me1\">getMonth<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> date.<span class=\"me1\">getDate<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">8<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Looks fine now:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/08\/step3.png\" alt=\"how to zoom the scheduling area with JavaScript\" \/><\/p>\n<p>Now let\u2019s add some gear to really zoom through time.<\/p>\n<h2>Zooming through Timelines Enabled<\/h2>\n<p>First, add an event listener for the wheel event, which fires whenever you rotate a wheel button of your mouse or some other pointing device:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">document.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#scheduler_here&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;wheel&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/change mode<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span> state <span class=\"sy0\">=<\/span> scheduler.<span class=\"me1\">getActionData<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span> mode <span class=\"sy0\">=<\/span> scheduler.<span class=\"me1\">getState<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">mode<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span> num <span class=\"sy0\">=<\/span> mode.<span class=\"me1\">substr<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">8<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>state <span class=\"sy0\">&amp;&amp;<\/span> state.<span class=\"me1\">date<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>e.<span class=\"me1\">deltaY<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; num<span class=\"sy0\">++;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; num<span class=\"sy0\">--;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>num<span class=\"sy0\">&gt;<\/span><span class=\"nu0\">0<\/span> <span class=\"sy0\">&amp;&amp;<\/span> num<span class=\"sy0\">&lt;<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">setCurrentView<\/span><span class=\"br0\">&#40;<\/span>state.<span class=\"me1\">date<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;timeline&quot;<\/span><span class=\"sy0\">+<\/span>num<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&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<p>The handler takes one parameter &#8211; the <em>WheelEvent<\/em> object, which was used to return the current cursor-pointed date and section (with the <em>getActionData(e)<\/em> method) and to define the new zooming level (by testing the <em>deltaY<\/em> value). If the date and section of the timeline that were pointed with a cursor are defined, the name is changed and validated, and you\u2019ll see another level of the timeline.<\/p>\n<p>Okay. Next, to prevent you from zooming too fast and crashing somewhere far away, let\u2019s add four lines of code:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> last_used <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndocument.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#scheduler_here&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;wheel&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/prevent too fast scrolling<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span> time <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>time <span class=\"sy0\">-<\/span> last_used <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">200<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; last_used <span class=\"sy0\">=<\/span> time<span class=\"sy0\">;<\/span><br \/>\n&nbsp; <br \/>\n&nbsp; <span class=\"co1\">\/\/change mode<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/...<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>If you try turning the wheel faster than 5 times per second, nothing will happen.<\/p>\n<p>Cool, now we have a nice blue tool for travelling between timelines.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/08\/step04c.gif\" alt=\"zoom the scheduling\" \/><\/p>\n<p><a href=\"https:\/\/snippet.dhtmlx.com\/0vuj015j?mode=wide\" target=\"_blank\" rel=\"noopener noreferrer\">Live demo >><\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>You\u2019ve <a href=\"https:\/\/snippet.dhtmlx.com\/0vuj015j?mode=wide\" target=\"_blank\" rel=\"noopener noreferrer\">done it<\/a>, you have a tool to view timelines from different perspectives by zooming. Time is not so different from space after all! This can be useful and convenient for scheduling apps, especially if they are full of events and your end-users would like to effortlessly zoom in and out of timelines to see both the details and the big picture. If you have any cool ideas of how to enhance Scheduler with some more useful features, I\u2019ll be happy to hear from you. See ya!<\/p>\n<p><em>Written by Asta Vebraite, a tech writer at DHTMLX<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello, guys! Are you looking for another way to make your scheduling apps handier? In case you are, I\u2019ll show you how to zoom in and out of timelines &#8230;<\/p>\n","protected":false},"author":101011,"featured_media":4215,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,71,1,38],"tags":[33,14,15],"class_list":["post-4199","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-tips","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/4199","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\/101011"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=4199"}],"version-history":[{"count":5,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/4199\/revisions"}],"predecessor-version":[{"id":12153,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/4199\/revisions\/12153"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/4215"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=4199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=4199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=4199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}