{"id":12131,"date":"2024-02-13T15:04:10","date_gmt":"2024-02-13T12:04:10","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=12131"},"modified":"2024-02-14T00:11:59","modified_gmt":"2024-02-13T21:11:59","slug":"scenarios-of-using-javascript-calendar-widget-with-dhtmlx-gantt","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/scenarios-of-using-javascript-calendar-widget-with-dhtmlx-gantt\/","title":{"rendered":"Three Scenarios of Using JavaScript Calendar Widget with DHTMLX Gantt"},"content":{"rendered":"<p>We continue disclosing the interoperability potential of DHTMLX products in real-case scenarios. After showing you how to connect our Scheduler component with the JavaScript List control in the previous <a href=\"https:\/\/dhtmlx.com\/blog\/connect-dhtmlx-scheduler-suites-list-control\/\" rel=\"noopener\" target=\"_blank\">article<\/a>, we are excited to share how to empower our Gantt library with the Calendar widget. <\/p>\n<p>In project management, rational time usage plays a critical role. When working with a large number of tasks in a Gantt chart, it will certainly be necessary to spare time for specifying their duration. Therefore, it can be a good idea to complement it with calendar functionality for more convenient time management. Instead of using some third-party tools, you can rely on the time-proven <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxCalendar\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Calendar<\/a>.  <\/p>\n<p>In this blog post, you will learn three scenarios of using the JavaScript calendar widget from the Suite UI library with <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt<\/a>.<\/p>\n<h5>Calendar in Gantt Inline Editor for Start Date<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image1-1-1024x422.png\" alt=\"Gantt + Calendar widget - inline editor \" width=\"1024\" height=\"422\" class=\"alignnone size-large wp-image-12132\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image1-1-1024x422.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image1-1-300x124.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image1-1-768x316.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image1-1.png 1294w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/7igal1pr?mode=wide\" rel=\"noopener\" target=\"_blank\">Check the code snippet ><\/a><\/p>\n<p>We start with the case of adding a JavaScript calendar to the inline editor in the Gantt grid. The inline editor comes with multiple <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__inline_editing.html#custominlineeditor\" rel=\"noopener\" target=\"_blank\">predefined types of editors<\/a>. If you need something special such as a calendar to quickly set up a start date and time for tasks, it is necessary to create a custom inline editor. <\/p>\n<p>So let us describe how to do that in more detail.<\/p>\n<p>The first step is to create HTML elements in the <strong>show()<\/strong> method. These elements will be displayed when opening your custom editor.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">editor_types<\/span>.<span class=\"me1\">custom_editor<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; show<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">,<\/span> column<span class=\"sy0\">,<\/span> config<span class=\"sy0\">,<\/span> placeholder<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> html <span class=\"sy0\">=<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">'dhx_calendar_container'<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>input type<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text&quot;<\/span> id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;calendar&quot;<\/span> readonly data<span class=\"sy0\">-<\/span>widget<span class=\"sy0\">-<\/span>control style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;margin-left: 10px;&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; placeholder.<span class=\"me1\">innerHTML<\/span> <span class=\"sy0\">=<\/span> html<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>The Calendar widget should be added to the <strong>set_value()<\/strong> method.<\/p>\n<p>At the beginning of the function, you get the <strong>task<\/strong> object:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">set_value<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>value<span class=\"sy0\">,<\/span> id<span class=\"sy0\">,<\/span> column<span class=\"sy0\">,<\/span> node<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> task <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">getTask<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>After that, you need to create a new <strong>calendar<\/strong> object:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> calendar <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Calendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">null<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> task.<span class=\"me1\">start_date<\/span><span class=\"sy0\">,<\/span> dateFormat<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d\/%m\/%y %H:%i&quot;<\/span><span class=\"sy0\">,<\/span> timePicker<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--bordered&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In the first parameter, you specify the container in which the calendar should appear. You should use <strong>null<\/strong> to create a new <strong>calendar<\/strong> object but not add it to the page. The second parameter is an object with the calendar configuration.<\/p>\n<p>The <strong>value<\/strong> parameter shows the date that will be highlighted when the calendar is opened.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">value<span class=\"sy0\">:<\/span> task.<span class=\"me1\">start_date<\/span><\/div><\/div>\n<p>Next goes the date format:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dateFormat<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d\/%m\/%y %H:%i&quot;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>If you want to be able to set not only a date but also a time in the calendar, you can do it by adding the <strong>timePicker<\/strong> parameter (set its value to <em>true<\/em>).<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">timePicker<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><\/div><\/div>\n<p>The CSS parameter specifies the names of the classes that the calendar will receive.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--bordered&quot;<\/span><\/div><\/div>\n<p>This <a href=\"https:\/\/docs.dhtmlx.com\/suite\/helpers\/base_elements\/#list-of-css-classes-for-styling-a-widget\" rel=\"noopener\" target=\"_blank\">section<\/a> of our documentation gives the list of CSS classes that will be added when using particular class names.<\/p>\n<p>Then you create the <strong>popup<\/strong> object and add a calendar there.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> popup <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\npopup.<span class=\"me1\">attach<\/span><span class=\"br0\">&#40;<\/span>calendar<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After that, you have to find an input element and add the date value you get from the calendar to this element.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> dateInput <span class=\"sy0\">=<\/span> document.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#calendar&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\ndateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> calendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>As a result, after clicking on this element, the popup will be displayed with the calendar inside.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dateInput.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;click&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; popup.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span>dateInput<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>When selecting a date or time in the calendar, the value in the input element will be updated as well.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">calendar.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;change&quot;<\/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; &nbsp; dateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> calendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ uncomment to hide the popup with calendar after changing the date<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ popup.hide();<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In the current case, users can select a date and then modify it by selecting another one or setting the time while the Calendar popup remains displayed. To save the entered values, you need to click on an empty space in the Gantt chart. As a result, the inline editor will close, and the values will be saved.<\/p>\n<p>If you uncomment the line with the <strong>popup.hide()<\/strong> method in the sample, the popup with the calendar will be hidden immediately after the date or time is changed, but the inline editor itself will remain open. To apply the changes, you also need to click on an empty space in the Gantt chart.<\/p>\n<p>In the <strong>get_value()<\/strong> method, you get the date value from the input element, convert this value from a string to a date object, and then specify a new date for the task.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">get_value<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">,<\/span> column<span class=\"sy0\">,<\/span> node<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> newValue <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;input&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">value<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> dateValue <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">str_to_date<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%d-%m-%y %H:%i&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#40;<\/span>newValue<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> dateValue<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>In the <strong>is_changed()<\/strong> method, you check whether the current date is different from the one displayed when opening the inline editor.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">is_changed<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>value<span class=\"sy0\">,<\/span> id<span class=\"sy0\">,<\/span> column<span class=\"sy0\">,<\/span> node<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"sy0\">+<\/span>value <span class=\"sy0\">!=<\/span> <span class=\"sy0\">+<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">get_value<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">,<\/span> column<span class=\"sy0\">,<\/span> node<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>These are the key technical peculiarities that must be taken into account when adding the Suite\u2019s Calendar to the Gantt inline editor.<\/p>\n<h5>Two Calendars in Gantt Task Lightbox for Start and End Dates<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image4-1024x421.png\" alt=\"Calendar in the Gantt task lightbox\" width=\"1024\" height=\"421\" class=\"alignnone size-large wp-image-12135\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image4-1024x421.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image4-300x123.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image4-768x316.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image4.png 1294w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/7pviudql?mode=wide\" rel=\"noopener\" target=\"_blank\">Check the code snippet ><\/a><\/p>\n<p>The second scenario will give you an idea of how to enrich the capabilities of the lightbox in tasks with two calendars for <strong>start_date<\/strong> and <strong>end_date<\/strong> parameters.<\/p>\n<p>In the lightbox, you can set start and end dates for a given task. Therefore, you can display two interconnected calendars, one will be tied to the start date, and the other to the end date.<\/p>\n<p>Standard lightbox sections won\u2019t suit this purpose, so you need to create a <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__custom_editor.html\" rel=\"noopener\" target=\"_blank\">custom lightbox section<\/a>.<\/p>\n<p>Start with the <strong>render()<\/strong> method, where you should add HTML elements for displaying two calendars with the task duration. The function is called when the lightbox is opened.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">&nbsp; &nbsp; render<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>sns<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">'dhx_calendar_cont'<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>input type<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text&quot;<\/span> id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;startDateCalendar&quot;<\/span> readonly data<span class=\"sy0\">-<\/span>widget<span class=\"sy0\">-<\/span>control style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;margin-left: 10px;&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&amp;<\/span>#<span class=\"nu0\">8211<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>input type<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text&quot;<\/span> id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;endDateCalendar&quot;<\/span> readonly data<span class=\"sy0\">-<\/span>widget<span class=\"sy0\">-<\/span>control style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;margin-left: 10px;&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;<\/span>label id<span class=\"sy0\">=<\/span><span class=\"st0\">'duration'<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>label<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>In <strong>set_value<\/strong>, you add calendars to the containers prepared for them.<\/p>\n<p>First, you create a new calendar object for a start date. We explained the purpose of such parameters above, so we won\u2019t dwell on this question and move on.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> startDateCalendar <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Calendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">null<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> task.<span class=\"me1\">start_date<\/span><span class=\"sy0\">,<\/span> dateFormat<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d %F %Y %H:%i&quot;<\/span><span class=\"sy0\">,<\/span> timePicker<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--bordered&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After that, you create a new <strong>popup<\/strong> object and add the <strong>startDate<\/strong> calendar there.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> startDatePopup <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nstartDatePopup.<span class=\"me1\">attach<\/span><span class=\"br0\">&#40;<\/span>startDateCalendar<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The subsequent algorithm of actions is similar to the scenario with the inline editor. You need to specify the date value for the input element. When clicking on the element, the popup menu with the calendar should be shown.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> startDateInput <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#startDateCalendar&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nstartDateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> startDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nstartDateInput.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;click&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; startDatePopup.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span>startDateInput<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>When the date or time in the calendar changes, you update the date value of the input element using the <strong>updateDuration()<\/strong> method.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">startDateCalendar.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;change&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; startDateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> startDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; updateDuration<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>You also have to call a function that calculates a new task duration depending on the values of the <strong>start_date<\/strong> and <strong>end_date<\/strong> input elements. When the value is calculated, you update the value of the <strong>duration<\/strong> element. If the duration value is greater than 1, you need to add the &#8220;s&#8221; postfix to show that the task duration takes several days.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">function<\/span> updateDuration<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> startDate <span class=\"sy0\">=<\/span> strToDate<span class=\"br0\">&#40;<\/span>startDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> endDate <span class=\"sy0\">=<\/span> strToDate<span class=\"br0\">&#40;<\/span>endDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> duration <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">calculateDuration<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> start_date<span class=\"sy0\">:<\/span> startDate<span class=\"sy0\">,<\/span> end_date<span class=\"sy0\">:<\/span> endDate<span class=\"sy0\">,<\/span> task <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> durationEl <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#duration&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; let postfix <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot; day&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>duration <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; postfix <span class=\"sy0\">+=<\/span> <span class=\"st0\">&quot;s&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; durationEl.<span class=\"me1\">innerHTML<\/span> <span class=\"sy0\">=<\/span> duration <span class=\"sy0\">+<\/span> postfix<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The calendar for <strong>end_date<\/strong> is added in the same way, only with different variable names.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> endDateCalendar <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Calendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">null<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> task.<span class=\"me1\">end_date<\/span><span class=\"sy0\">,<\/span> dateFormat<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d %F %Y %H:%i&quot;<\/span><span class=\"sy0\">,<\/span> timePicker<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--bordered&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> endDatePopup <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nendDatePopup.<span class=\"me1\">attach<\/span><span class=\"br0\">&#40;<\/span>endDateCalendar<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> endDateInput <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#endDateCalendar&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nendDateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> endDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nendDateInput.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;click&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; endDatePopup.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span>endDateInput<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nendDateCalendar.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;change&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; endDateInput.<span class=\"me1\">value<\/span> <span class=\"sy0\">=<\/span> endDateCalendar.<span class=\"me1\">getValue<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ uncomment to hide the popup with calendar after changing the date<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ endDatePopup.hide();<\/span><br \/>\n&nbsp; &nbsp; updateDuration<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now it is time to connect calendars. One fundamental condition here is that the date of the first calendar (<strong>start_date<\/strong> calendar) cannot be greater than the date of the second calendar (<strong>end_date<\/strong> calendar). So, if you have to postpone a particular task to a later date, first, you\u2019ll have to change its end date. If calendars are not linked to each other, then it will be possible to set incorrect dates for tasks and they won\u2019t be displayed in the timeline.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">startDateCalendar.<span class=\"me1\">link<\/span><span class=\"br0\">&#40;<\/span>endDateCalendar<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The <strong>get_value()<\/strong> method is called when data is saved in the lightbox. In this method, you update task dates depending on the values of the input elements.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">&nbsp;get_value<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>node<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">const<\/span> startDateInput <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#startDateCalendar&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">const<\/span> endDateInput <span class=\"sy0\">=<\/span> node.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#endDateCalendar&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;task.<span class=\"me1\">start_date<\/span> <span class=\"sy0\">=<\/span> strToDate<span class=\"br0\">&#40;<\/span>startDateInput.<span class=\"me1\">value<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;task.<span class=\"me1\">end_date<\/span> <span class=\"sy0\">=<\/span> strToDate<span class=\"br0\">&#40;<\/span>endDateInput.<span class=\"me1\">value<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">return<\/span> task<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>That\u2019s pretty much all you should know to successfully expand the lightbox functionality with DHTMLX Calendar.<\/p>\n<h5>Calendar in Popup Menu for Editing Deadlines<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image3-1024x419.png\" alt=\"calendar in Gantt&#039;s popup menu\" width=\"1024\" height=\"419\" class=\"alignnone size-large wp-image-12139\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image3-1024x419.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image3-300x123.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image3-768x314.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/02\/image3.png 1293w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/xpz4dim8?mode=wide\" rel=\"noopener\" target=\"_blank\">Check the code snippet ><\/a><br \/>\nAnd finally, we want to share with you how the Calendar widget from the Suite library can be used for demonstrating task deadlines in the Gantt timeline.<\/p>\n<p>This customization looks quite unusual, so let us clarify how it should work in practice. After the double click on the deadline element in the timeline, it will be possible to change the deadline date or remove it. If a given task has no deadline and end-users want to add this parameter, all they have to do is to double-click on the needed task row in the timeline and add a deadline. <\/p>\n<p>Now, we can proceed to the implementation stage of this customization.<\/p>\n<p>In this scenario, deadlines are drawn using an additional layer. A custom element is complemented with an attribute, where the task ID should be specified.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">attachEvent<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;onGanttReady&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; gantt.<span class=\"me1\">addTaskLayer<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span> drawPlanned<span class=\"br0\">&#40;<\/span>task<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>task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> sizes <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">getTaskPosition<\/span><span class=\"br0\">&#40;<\/span>task<span class=\"sy0\">,<\/span> task.<span class=\"me1\">deadline<\/span><span class=\"sy0\">,<\/span> task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> el <span class=\"sy0\">=<\/span> document.<span class=\"me1\">createElement<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'div'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span class=\"me1\">className<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'deadline'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span class=\"me1\">setAttribute<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;data-taskId&quot;<\/span><span class=\"sy0\">,<\/span> task.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span class=\"me1\">style<\/span>.<span class=\"me1\">left<\/span> <span class=\"sy0\">=<\/span> sizes.<span class=\"me1\">left<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">'px'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span class=\"me1\">style<\/span>.<span class=\"me1\">top<\/span> <span class=\"sy0\">=<\/span> sizes.<span class=\"me1\">top<\/span> <span class=\"sy0\">+<\/span> <span class=\"nu0\">7<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">'px'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> el<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>An event handler for the double mouse click is added the following way:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">window.<span class=\"me1\">addEventListener<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'dblclick'<\/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><\/div><\/div>\n<p>Using this handler, you check if there is already an open dialog window for editing the deadline date. If so, it is necessary to terminate the function using the return statement.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>document.<span class=\"me1\">querySelector<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;.deadline_editor&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The next thing you should do is to get the DOM element of the deadline or the task row in the timeline.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> deadlineNode <span class=\"sy0\">=<\/span> e.<span class=\"me1\">target<\/span>.<span class=\"me1\">closest<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;.deadline&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> taskRowNode <span class=\"sy0\">=<\/span> e.<span class=\"me1\">target<\/span>.<span class=\"me1\">closest<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;.gantt_task_row&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> targetNode <span class=\"sy0\">=<\/span> deadlineNode <span class=\"sy0\">||<\/span> taskRowNode<span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The DOM element&#8217;s attributes help you get the task ID, which will be used in the <strong>getTask()<\/strong> method to get the <strong>task<\/strong> object.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> taskId <span class=\"sy0\">=<\/span> targetNode.<span class=\"me1\">dataset<\/span>.<span class=\"me1\">taskId<\/span> <span class=\"sy0\">||<\/span> targetNode.<span class=\"me1\">dataset<\/span>.<span class=\"me1\">taskid<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span> task <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">getTask<\/span><span class=\"br0\">&#40;<\/span>taskId<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>If, after a double-click on the cell in the timeline, it already has the deadline, then this operation is most likely aimed not at changing the deadline date but at something else. Therefore, in this case, you should terminate the function with the <strong>return<\/strong> statement.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>taskRowNode <span class=\"sy0\">&amp;&amp;<\/span> task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Then you have to set the deadline date for a task. Take it from the corresponding <strong>deadline<\/strong> property of the task. If the task does not have a deadline, you need to take the date from the click in the timeline. To do this, make use of the <strong>getRelativeEventPosition()<\/strong> method. The first argument of this method will be the click event itself (`e`), and the second argument will be the DOM element of the timeline. The method will return the click position in the timeline. Next, you use the <strong>dateFromPos()<\/strong> method to get the date from the click position.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">let deadlineDate<span class=\"sy0\">;<\/span> <br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; deadlineDate <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <span class=\"kw4\">Date<\/span><span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">const<\/span> clickPos <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">utils<\/span>.<span class=\"me1\">dom<\/span>.<span class=\"me1\">getRelativeEventPosition<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"sy0\">,<\/span> gantt.$task_data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; deadlineDate <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">dateFromPos<\/span><span class=\"br0\">&#40;<\/span>clickPos.<span class=\"me1\">x<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The following step is to create a popup instance and add HTML content to it. There will be buttons for saving changes, deleting a deadline, and the calendar itself for selecting a date and time.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> popup <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Popup<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;deadline_editor dhx_widget--bordered&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\npopup.<span class=\"me1\">attachHTML<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;div id='form_container'&gt;&lt;\/div&gt;&lt;div id='calendar_container'&gt;&lt;\/div&gt;&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After that, the calendar is shown under the clicked element.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">popup.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span>targetNode<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The calendar can be added to the popup only after it is redrawn. Therefore, you need to put the following code inside the function, which will be actuated after the popup redrawing:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">awaitRedraw<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ code<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>When the popup is redrawn, you need to add a new calendar instance. In this case, you specify the ID of the container, where the Calendar should be initialized.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> calendar <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Calendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;calendar_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; value<span class=\"sy0\">:<\/span> deadlineDate<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; dateFormat<span class=\"sy0\">:<\/span> gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">date_format<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; timePicker<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--bordered&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The next move is to add an event handler that will fire when a date or time is selected in the calendar and add the selected date to the <strong>deadlineDate<\/strong> variable.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">calendar.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;change&quot;<\/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; &nbsp;deadlineDate <span class=\"sy0\">=<\/span> date<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Now it is time to create a form, in which you can show two buttons. In the <strong>CSS<\/strong> property, you specify <strong>dhx_widget&#8211;border_bottom<\/strong> to render the frame under the buttons and visually separate the form with buttons from the calendar. In the <strong>align<\/strong> parameter, you set the alignment on the width of the page.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> form <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Form<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;form_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; rows<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dhx_widget--border_bottom&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; align<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;evenly&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cols<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;save&quot;<\/span><span class=\"sy0\">,<\/span> view<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;flat&quot;<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Save&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;button&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;delete&quot;<\/span><span class=\"sy0\">,<\/span> view<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;link&quot;<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Delete&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;button&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>And lastly, you have to add event handlers to the form. These handlers will fire when the buttons get clicked on. In one of the event handlers you specify the deadline value to the task, while in the other one, you should remove the <strong>deadline<\/strong> property. After that, update the task and hide the popup.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">form.<span class=\"me1\">getItem<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;save&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;click&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>events<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; task.<span class=\"me1\">deadline<\/span> <span class=\"sy0\">=<\/span> deadlineDate<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; gantt.<span class=\"me1\">updateTask<\/span><span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; popup.<span class=\"me1\">hide<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nform.<span class=\"me1\">getItem<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;delete&quot;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">events<\/span>.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;click&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>events<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">deadline<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span> task.<span class=\"me1\">deadline<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">updateTask<\/span><span class=\"br0\">&#40;<\/span>task.<span class=\"me1\">id<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; popup.<span class=\"me1\">hide<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>That\u2019s how you can implement task deadlines in the Gantt timeline using the calendar widget from the Suite library.<\/p>\n<h5>Conclusion<\/h5>\n<p>With the instructions provided in the guides above, you get three options for effective usage of the Suite\u2019s calendar widget in project management apps based on DHTMLX Gantt. You have an opportunity to try these options in your app by downloading <a href=\"https:\/\/dhtmlx.com\/docs\/download\/\" rel=\"noopener\" target=\"_blank\">free 30-day trial versions<\/a> of both products. Stay tuned for more tutorials dedicated to the customization of DHTMLX libraries in the future.<\/p>\n<h5>Related Materials:<\/h5>\n<ul>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/7igal1pr?mode=wide\" rel=\"noopener\" target=\"_blank\">Calendar in Gantt inline editor for start date (sample)<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/7pviudql?mode=wide\" rel=\"noopener\" target=\"_blank\">Two calendars in Gantt task lightbox for start and end dates (sample)<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/xpz4dim8?mode=wide\" rel=\"noopener\" target=\"_blank\">Calendar in popup menu for editing deadlines<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/blog\/connect-dhtmlx-scheduler-suites-list-control\/\" rel=\"noopener\" target=\"_blank\">How to connect DHTMLX Scheduler with Suite\u2019s List control<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/blog\/integrate-dhtmlx-suite-widgets-schedulers-lightbox\/\" rel=\"noopener\" target=\"_blank\">How to integrate DHTMLX Suite widgets into Scheduler\u2019s lightbox<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/download\/\" rel=\"noopener\" target=\"_blank\">Free 30-day trial versions<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We continue disclosing the interoperability potential of DHTMLX products in real-case scenarios. After showing you how to connect our Scheduler component with the JavaScript List control in the previous &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":12142,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[33,20,10],"class_list":["post-12131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-all-posts","tag-gantt","tag-dhtmlxsuite"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12131","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=12131"}],"version-history":[{"count":13,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12131\/revisions"}],"predecessor-version":[{"id":12148,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/12131\/revisions\/12148"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/12142"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=12131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=12131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=12131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}