{"id":7215,"date":"2020-04-04T12:28:18","date_gmt":"2020-04-04T09:28:18","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=7215"},"modified":"2026-09-15T14:22:33","modified_gmt":"2026-09-15T11:22:33","slug":"dhtmlx-gantt-7-0-node-js-server-module-merging-multiple-calendars-reordering-grid-columns-drag-n-drop-new-customization-options","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-gantt-7-0-node-js-server-module-merging-multiple-calendars-reordering-grid-columns-drag-n-drop-new-customization-options\/","title":{"rendered":"DHTMLX Gantt 7.0: Node.js Server Module, Setting Working Time in Minutes, New Customization Options, and Much More"},"content":{"rendered":"<p>Here comes a turning point in the release history of our JavaScript and <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" rel=\"noopener\" target=\"_blank\">HTML5 Gantt chart<\/a>. A new version 7.0 delivers not only several major updates to our client-side library but also rolls out a trailblazing server-side Gantt module for Node.js. This server add-on will give you access to the logic of DHTMLX Gantt and enable you to perform scheduling analysis, receive real-time updates triggered by user actions from different sources, and synchronize Gantt schedule accordingly.<\/p>\n<p>New features of our client-side library v7.0 include the ability to assign resources with different working calendars to the same task using a merged calendar, set working time in minutes, reorder Grid columns by drag-n-drop, customize the Quick Info popup, fine-tune Grid columns by making their width flexible, and manipulate the Content Security Policy (CSP) compatibility via the API. Besides, there are changes in the package structure and the way localization and extensions work in DHTMLX Gantt. Dive deeper into the release details in our article.<\/p>\n<p><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml?utm_source=(direct)&#038;utm_medium=banner&#038;utm_campaign=Gantt7_0&#038;utm_term=trial\" rel=\"noopener\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/dhtmlxGantt-brandimg-900_tiny.jpg\" alt=\"DHTMLX Gantt Trial\" width=\"900\" height=\"300\" class=\"aligncenter size-full wp-image-7229\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/dhtmlxGantt-brandimg-900_tiny.jpg 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/dhtmlxGantt-brandimg-900_tiny-300x100.jpg 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/dhtmlxGantt-brandimg-900_tiny-768x256.jpg 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><strong><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml?utm_source=(direct)&#038;utm_medium=referral&#038;utm_campaign=Gantt7_0&#038;utm_term=trial\" rel=\"noopener\" target=\"_blank\">Download a brand new trial version 7.0 right now ><\/a><\/strong><\/p>\n<h5>Using DHTMLX Gantt with Node.js on the Server [New Add-on]<\/h5>\n<p>The most groundbreaking novelty of v7.0 is the introduction of the server-side version of DHTMLX Gantt library. Now there is a Node.js build of DHTMLX Gantt intended for running on the server. <\/p>\n<p>It gives developers an opportunity to use complex logic of DHTMLX Gantt &#8211; such as auto-scheduling, critical path, and working time calculations &#8211; on the server-side. This is essential for synchronizing actions of multiple users from different sources (e.g. desktop and mobile apps or different components of the same app) as well as conducting scheduling analysis on the server-side and updating Gantt on the client-side in real-time.<\/p>\n<p>As DHTMLX Gantt for Node.js is provided as a separate package, you can acquire it as an add-on to the client-side version of Gantt under any commercial license (<a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/commercial\/\" rel=\"noopener\" target=\"_blank\">Commercial<\/a>, <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/enterprise\/\" rel=\"noopener\" target=\"_blank\">Enterprise<\/a>, or <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/ultimate\/\" rel=\"noopener\" target=\"_blank\">Ultimate<\/a>).<\/p>\n<p>Read more about the versioning and installation of Node.js Gantt chart <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__using_gantt_on_server.html\" rel=\"noopener\" target=\"_blank\">in the documentation ><\/a><\/p>\n<h5>Specifying Working Time in Minutes<\/h5>\n<p>Starting with v7.0, it&#8217;s possible to <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__working_time.html#globalsettings\" rel=\"noopener\" target=\"_blank\">set the working time<\/a> not only in hours but also in minutes via the <strong>setWorkTime<\/strong> property. Thus, a working day can start at 08:15 am and finish at 12:45 pm.<\/p>\n<p>To do so, you need to specify the <strong>duration_unit<\/strong> configuration option as &#8220;minute&#8221;:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">duration_unit<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;minute&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ sets the working time up to minutes<\/span><br \/>\ngantt.<span class=\"me1\">setWorkTime<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>hours<span class=\"sy0\">:<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;8:15-12:45&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>In the following example, we changed the start of the working day, on which Task 1.1 is assigned, from 08:15 to 08:45 am:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/work_time_minutes.gif\" alt=\"Setting work time in minutes - DHTMLX Gantt\" width=\"1282\" height=\"480\" class=\"aligncenter size-full wp-image-7221\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/09_worktime\/11_working_hours_with_minutes.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<h5>Merging Multiple Working Calendars [PRO]<\/h5>\n<p>Flexible working hours and floating or shift schedules of employees make it hard to estimate the workload and timeline of a project. To overcome these difficulties, we introduced a new ability to <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__working_time.html#mergingcalendars\" rel=\"noopener\" target=\"_blank\">merge different working calendars<\/a> into one in v7.0. <\/p>\n<p>The resulting work schedule will be based on the overlapping working hours of employees involved in a project. For instance, if working hours of one employee are from 8 am to 4 pm while another employee works from 11 am to 7 pm, the merged calendar will have a work schedule from 11 am to 4 pm. Thus, when you assign several employees to one task, the duration of this task will be calculated on the basis of their common working time. <\/p>\n<p>Merging different calendars into one can be done automatically by setting the <strong>gantt.config.dynamic_resource_calendars<\/strong> configuration option to <em>true<\/em>. <\/p>\n<p>Let&#8217;s take two different working calendars of John and Anna as an example. John works on Mondays, Wednesdays, and Fridays, while Anna works on Mondays, Tuesdays, Fridays, and Saturdays. If we enable the <strong>dynamic_resource_calendars<\/strong> config, John&#8217;s and Anna&#8217;s working calendars will merge automatically when they are assigned to the same task. In fact, it means that they will be able to perform a common task on Mondays and Fridays only:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ automatically merge working calendars when multiple resources assigned to a task<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">dynamic_resource_calendars<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">resource_property<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;users&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">resource_calendars<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span> gantt.<span class=\"me1\">addCalendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worktime<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; days<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/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\">1<\/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=\"br0\">&#93;<\/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><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"nu0\">2<\/span><span class=\"sy0\">:<\/span> gantt.<span class=\"me1\">addCalendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; worktime<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; days<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/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=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/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><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>As shown in the picture below, it takes 5 working days to complete Task 1 for John and Anna, but taking into account that they are both available only on Mondays and Fridays according to their merged working calendar, Task 1 has an overall duration of 15 days:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Merging_work_calendar.png\" alt=\"Merging work calendars in DHTMLX Gantt\" width=\"1564\" height=\"259\" class=\"aligncenter size-full wp-image-7218\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Merging_work_calendar.png 1564w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Merging_work_calendar-300x50.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Merging_work_calendar-768x127.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Merging_work_calendar-1024x170.png 1024w\" sizes=\"auto, (max-width: 1564px) 100vw, 1564px\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/09_worktime\/10_merge_calendars.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>If you need to merge working calendars of particular resources only, you can do it manually with the help of the <strong>mergeCalendars<\/strong> method.<\/p>\n<p>In the example below, we use the <strong>mergeCalendars<\/strong> method to merge John&#8217;s and Anna&#8217;s working calendars:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> johnCalendarId <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">addCalendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; worktime<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; hours<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;0:00-24:00&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; days<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/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\">1<\/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=\"br0\">&#93;<\/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><br \/>\n<span class=\"kw1\">const<\/span> annaCalendarId <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">addCalendar<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; worktime<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; hours<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;8:00-12:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;13:00-17:00&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; days<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/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=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/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><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> joinedCalendar <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">mergeCalendars<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; gantt.<span class=\"me1\">getCalendar<\/span><span class=\"br0\">&#40;<\/span>johnCalendarId<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; gantt.<span class=\"me1\">getCalendar<\/span><span class=\"br0\">&#40;<\/span>annaCalendarId<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Apart from this essential configuration update, we also added the <strong>getResourceCalendar<\/strong> method, which returns the calendar of the assigned resource, and updated the <strong>resource_calendar<\/strong> config. Besides, from now on, Gantt will recalculate the project schedule automatically when a task calendar changes. <\/p>\n<h5>Customizing a Quick Info Popup<\/h5>\n<p>V7.0 brought out new customization options of DHTMLX Gantt. We expanded the functionality of the Quick Info extension by introducing the <strong>gantt.ext.quickInfo<\/strong> configuration object with a range of methods to manipulate the look and feel of the Quick Info popup:<\/p>\n<ul>\n<li>The <strong>show()<\/strong> method allows specifying a task, for which the popup should be displayed, as well as X and Y coordinates where to show a popup;<\/li>\n<li>The <strong>hide()<\/strong> method makes it possible either to hide a popup immediately or apply animation effects;<\/li>\n<li>The <strong>setContent (config: object)<\/strong> method defines which content to include in a popup like header elements and buttons.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__quickinfo_ext.html\" rel=\"noopener\" target=\"_blank\">Learn more in the documentation ><\/a><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/quick_custom.png\" alt=\"Custom quick info popup - DHTMLX Gantt\" width=\"298\" height=\"140\" class=\"aligncenter size-full wp-image-7223\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/02_extensions\/01_quickinfo.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">locale<\/span>.<span class=\"me1\">labels<\/span>.<span class=\"me1\">custom_button<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;My button&quot;<\/span><br \/>\ngantt.<span class=\"me1\">ext<\/span>.<span class=\"me1\">quickInfo<\/span>.<span class=\"me1\">setContent<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; header<span class=\"sy0\">:<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; title<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;My custom header&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;18th of February, 2020&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; content<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;some content here&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; buttons<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;custom_button&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n<h5>Reordering Grid Columns by Drag-n-Drop<\/h5>\n<p>Due to the new configuration option <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_reorder_grid_columns_config.html\" rel=\"noopener\" target=\"_blank\"><strong>reorder_grid_columns<\/strong><\/a>, you can change an order of columns in the Grid by simply moving them using drag-n-drop. By default, this feature is disabled. You can enable it in the following way:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">reorder_grid_columns<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>If needed, you can style the dragged column and the marker highlighting where to place the column with the help of CSS classes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/Reordering_grid_columns.gif\" alt=\"Reordering grid columns by drag-n-drop - DHTMLX Gantt\" width=\"1249\" height=\"404\" class=\"aligncenter size-full wp-image-7225\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/11_resources\/12_work_and_material_resources.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<h5>Flexible Width of Columns in the Grid<\/h5>\n<p>At the request of our users, we decided to add more flexibility to the way Grid columns are displayed in Gantt. Due to the new configuration option <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_grid_elastic_columns_config.html\" rel=\"noopener\" target=\"_blank\"><strong>grid_elastic_columns<\/strong><\/a>, columns will fit the table width by either shrinking or stretching. The horizontal scroll will appear only if the columns&#8217; minimum width is too small to display their content. <a href=\"https:\/\/snippet.dhtmlx.com\/5\/904382de5\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>By default, this feature is disabled and thus the width of columns is fixed. In order to enable it, you need to set the <strong>grid_elastic_column<\/strong> config to <em>true<\/em>:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">grid_elastic_columns<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>As a cherry on the cake, now you can apply the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__styling_guide.html#customizationgridcolumns\" rel=\"noopener\" target=\"_blank\"><strong>text-overflow: ellipsis<\/strong><\/a> property to display the clipped content of columns in a neat way:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/ellipsis-3.png\" alt=\"Customizing Grid Columns - DHTMLX Gantt\" width=\"513\" height=\"368\" class=\"aligncenter size-full wp-image-7226\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/ellipsis-3.png 513w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2020\/04\/ellipsis-3-300x215.png 300w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/p>\n<p>Please note that starting with v7.0 Gantt uses the CSS flexbox layout in its lefthand Grid columns, what might affect the styling of your Grid in DHTMLX Gantt.<\/p>\n<h5>Content Security Policy Update<\/h5>\n<p>Starting with v7.0, the Content Security Policy extension is replaced with the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_csp_config.html\" rel=\"noopener\" target=\"_blank\"><strong>config.csp<\/strong><\/a> configuration option, which will work out-of-the-box:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">csp<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;auto&quot;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>This configuration option makes Gantt CSP compatible and at the same time ensures the implementation of a high-performance code maintaining a high speed of the component. <\/p>\n<p>By default, the config is set to <em>&#8220;auto&#8221;<\/em>, thus allowing Gantt to use a high-performance code wherever it&#8217;s possible and resort to a CSP compatible code where it&#8217;s necessary. However, depending on your needs, you can either disable this config and make Gantt use a high-performance approach by specifying the <strong>gantt.config.csp = false<\/strong> or set the <strong>gantt.config.csp<\/strong> to <em>true<\/em> for always applying the CSP compatible code.<\/p>\n<p>Besides, now DHTMLX Gantt makes use only of valid HTML5 data attributes. <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/migrating.html#6370\" rel=\"noopener\" target=\"_blank\">Learn more ><\/a><\/p>\n<p>The CSP update contributes to a more convenient work with our JS Gantt chart, in Salesforce Lightning in particular.<\/p>\n<h5>Migration Notes<\/h5>\n<p>V7.0 presents some technical changes to the package structure of DHTMLX Gantt. Now all extensions and locales are bundled with the <em>dhtmlxgantt.js<\/em> file and should be called via Gantt API. Read more about the changes in the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/migrating.html#6370\" rel=\"noopener\" target=\"_blank\">Migration article ><\/a><\/p>\n<p>To make a long story short, <strong>download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" rel=\"noopener\" target=\"_blank\">trial version<\/a> 7.0<\/strong> of our JavaScript Gantt and try out a new Gantt Node.js server module and evaluate them <strong>free of charge for 30 days<\/strong>. <\/p>\n<p>We invite our current clients to get the latest Gantt chart version 7.0 in the <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client&#8217;s Area<\/a>. <\/p>\n<p>Feel free to leave your feedback in the comments below. We&#8217;ll be looking forward to hearing from you!<\/p>\n<h5>Related Materials:<\/h5>\n<ul>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" rel=\"noopener\" target=\"_blank\">JavaScript Gantt<\/a> Page<\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__using_gantt_on_server.html\" rel=\"noopener\" target=\"_blank\">Node.js Server Module Guide<\/a><\/li>\n<li>Full <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/whatsnew.html\" rel=\"noopener\" target=\"_blank\">&#8220;What&#8217;s New&#8221; List<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/demos\/\" rel=\"noopener\" target=\"_blank\">Live Samples<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Here comes a turning point in the release history of our JavaScript and HTML5 Gantt chart. A new version 7.0 delivers not only several major updates to our client-side &#8230;<\/p>\n","protected":false},"author":101012,"featured_media":7228,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,70,1,38],"tags":[33,20,39,4],"class_list":["post-7215","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-releases","category-uncategorized","category-visible","tag-all-posts","tag-gantt","tag-nodejs","tag-dhtmlx-updates"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/7215","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\/101012"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=7215"}],"version-history":[{"count":22,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/7215\/revisions"}],"predecessor-version":[{"id":15889,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/7215\/revisions\/15889"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/7228"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=7215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=7215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=7215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}