{"id":14593,"date":"2025-11-05T11:11:54","date_gmt":"2025-11-05T08:11:54","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=14593"},"modified":"2026-09-15T14:24:20","modified_gmt":"2026-09-15T11:24:20","slug":"dhtmlx-gantt-9-1","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-gantt-9-1\/","title":{"rendered":"DHTMLX Gantt 9.1: Tailored Time Scale, Flexible Split Tasks, Multi-User Live Updates, and Much More"},"content":{"rendered":"<p>When having conversations with our current customers, we often ask them what they would like to see in a new version of our products. They often do not have a ready answer to this question, especially regarding popular and mature components like DHTMLX Gantt. In such cases, they hardly need to see drastic changes in the tool that already works well, but rather targeted refinements focused on enhanced usability, flexibility, and developer convenience. That\u2019s what the new DHTMLX Gantt 9.1 is all about. <\/p>\n<p>The new Gantt version brings along timescale optimizations, better control over the rendering of split tasks, enhanced real-time collaboration, new lightbox control for resource assignment, and much more. <\/p>\n<p>These features are now available both in the <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" rel=\"noopener\" target=\"_blank\">JavaScript Gantt chart<\/a> and its <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt-for-React\/\" rel=\"noopener\" target=\"_blank\">React Gantt<\/a> version.<\/p>\n\n\t\t<div class='post-banner'>\n\t\t    <div class='post-banner__inside'>\n\t\t        <div>\n\t\t            <div class=\"post-banner__title\">Download DHTMLX Gantt v9.1<\/div>\n\t\t            <div class=\"post-banner__text\">Integrate a feature-packed Gantt chart in your project management app with ease<\/div>\n                <\/div>\n\t\t            \n                \n            <div class='post-banner__btn'>\n                <a href='https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml' title='' class='button-secondary'>Get free trial<\/a>\n            <\/div>\n        \n            <\/div>\n\t\t<\/div>\n\t\n<p>Let\u2019s go through the Gantt novelties in more detail.<\/p>\n<h2>Workhour-Aware Scale Projection<\/h2>\n<p>In DHTMLX Gantt, the default timescale is based on days, and each day in the timeline covers a 24-hour span (00:00-24:00). But in real-case scenarios, one working day usually lasts 8 hours (e.g. 09:00-17:00).  So, if you add a task that takes the whole working day to finish, it will fill only one-third of the 24-hour day cell. It may seem confusing, as if the task takes much less time to be completed than specified in the grid panel.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image3.gif\" alt=\"Gantt with workhour-aware scale projection\" width=\"1828\" height=\"556\" class=\"aligncenter size-full wp-image-14594\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/?sample=%2703_scales\/15_scale_projection_modes.html%27\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>The <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__configuring_time_scale.html#workhourawaretaskbarsrenderingindayweekscales\" rel=\"noopener\" target=\"_blank\">new workhour-aware scale projection<\/a> (projection mode) helps eliminate this visual mismatch. From now on, the length of task bars in the timeline depends on working hours rather than absolute time. In other words, a task that takes the full working day (8 hours) will fill the whole day cell. A task with a shorter duration\/timeframe will appear proportionally shorter within a given cell.<\/p>\n<p>Since working hours may vary between employees or departments (4 or 6 hours instead of the common 8 hours), the new feature will help adjust taskbar lengths to reflect the actual working time.<\/p>\n<p>The scale projection feature is applied to the bottom-most scale (Day or Week). To do that, you need to add the <strong>projection<\/strong> property to the corresponding scale object:<\/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\">scales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;month&quot;<\/span><span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%M %Y&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;week&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp;step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> date <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> to <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span>date<span class=\"sy0\">,<\/span> <span class=\"nu0\">7<\/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=\"st0\">&quot;day&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> format <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">date<\/span>.<span class=\"me1\">date_to_str<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;%d %M&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> `$<span class=\"br0\">&#123;<\/span>format<span class=\"br0\">&#40;<\/span>date<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span> <span class=\"sy0\">-<\/span> $<span class=\"br0\">&#123;<\/span>format<span class=\"br0\">&#40;<\/span>to<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;day&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp; step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d&quot;<\/span><span class=\"sy0\">,<\/span> projection<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> source<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;fixedHours&quot;<\/span> <span class=\"br0\">&#125;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Technically speaking, there are three projection modes for displaying working hours in timeline cells:<\/p>\n<ul>\n<li>Default mode &#8211;  the absolute time (00:00-24:00) to indicate working hours for tasks on the timeline.<\/li>\n<li>Fixed hours mode &#8211; fixed working hours for all tasks on the timeline (taken from global working time settings in Gantt)<\/li>\n<\/ul>\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\">scales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> \u201cday\u201d<span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> \u201c<span class=\"sy0\">%<\/span>d\u201d<span class=\"sy0\">,<\/span> projection<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> source<span class=\"sy0\">:<\/span> \u201cfixedHours\u201d <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Here is how working hours can be set manually:<\/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\">scales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> \u201cday\u201d<span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> \u201c<span class=\"sy0\">%<\/span>d\u201d<span class=\"sy0\">,<\/span> projection<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> source<span class=\"sy0\">:<\/span> \u201cfixedHours\u201d<span class=\"sy0\">,<\/span> hours<span class=\"sy0\">:<\/span> \u201c09<span class=\"sy0\">:<\/span>00<span class=\"sy0\">-<\/span><span class=\"nu0\">18<\/span><span class=\"sy0\">:<\/span>00\u201d <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<ul>\n<li>Task calendar mode &#8211; working hours for each day (cell) are calculated with the use of task calendars. If a cell has no work time, the default mode is applied.<\/li>\n<\/ul>\n<p>After specifying the new setting for a particular task (e.g., 9.00-17.00 on Monday), it will persist when dragging or resizing this task. For instance, if you decide that this task should take not one but two days and resize the task, the taskbar will remain aligned with the set working hours on both days (9.00-17.00, not full days). At the same time, the scheduling logic for a task (start and end time) still depends on the worktime calendar applied for this task.<\/p>\n<p>As a result, this novelty makes the timeline visualization match the real working schedule, which is especially useful when not all tasks follow the same daily schedule. <\/p>\n<p>And don&#8217;t forget that this feature is working only for Day and Week scales, while other scale formats stick to absolute time.<\/p>\n<h2>Fixed Column Width for the Time Scale<\/h2>\n<p>Normally, the width of the Gantt timeline cells automatically stretches to fit the size of the chart container or shrinks to the minimum allowed width (<strong>min_column_width<\/strong>) when horizontal scrolling appears. But what if you need the Gantt timeline with a fixed column width for the time scale? From now on, you can <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__configuring_time_scale.html#fixedcolumnwidth\" rel=\"noopener\" target=\"_blank\">set a specific length for columns<\/a> (e.g, 60 px) using the newly added <strong>column_width<\/strong> setting:<\/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\">scales<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;month&quot;<\/span><span class=\"sy0\">,<\/span> step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%F, %Y&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> unit<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;day&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp; step<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%j, %D&quot;<\/span><span class=\"sy0\">,<\/span> column_width<span class=\"sy0\">:<\/span> <span class=\"nu0\">60<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image4.gif\" alt=\"Gantt with fixed column width\" width=\"1212\" height=\"276\" class=\"aligncenter size-full wp-image-14595\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/gpq46mvq?mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>In the example above, first, you see the Gantt timeline with automatically adjusted column width, then it shows how the new <strong>column_width<\/strong> setting works in practice.<\/p>\n<p>This novelty is applied only to the bottom scale. If not enabled, the default behavior persists.<\/p>\n<h2>Per-Child Placement for Split Subtasks<\/h2>\n<p>In Gantt, split tasks are represented as subtasks of a parent task. By default, the parent bar is collapsed, and split subtasks are rendered on the parent\u2019s row. When expanded, split subtasks will render in separate subrows. From now on, you can <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__split_tasks.html#perchildplacementofsplitsubtasks\" rel=\"noopener\" target=\"_blank\">control how each subtask renders on the timeline<\/a>.<\/p>\n<p>For this purpose, you&#8217;ll need the new <strong>split_placement<\/strong> property of the task object, allowing you to specify the required mode depending on the state of the parent row:<\/p>\n<ul>\n<li>&#8220;split_placement&#8221;: &#8220;inline&#8221; &#8211; subtasks are always displayed on the parent\u2019s row.<\/li>\n<li>&#8220;split_placement&#8221;: &#8220;subrow&#8221; &#8211; subtasks are displayed in separate subrows, same way as regular tasks. If the parent is collapsed, the subtask is not visible.<\/li>\n<li>&#8220;split_placement&#8221;: &#8220;auto&#8221; (default behavior) &#8211; split subtasks are displayed on the parent\u2019s row when the parent item is collapsed and in subrows when the parent is expanded.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image1.gif\" alt=\"placement of split  subtasks\" width=\"1848\" height=\"428\" class=\"aligncenter size-full wp-image-14596\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/?sample=%2704_customization\/26_custom_child_split_tasks.html%27&#038;filter=%27%27\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">11<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Photo Shoot&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp; parent<span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;03-04-2025&quot;<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> &nbsp;split_placement<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;inline&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">12<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Video Editing&quot;<\/span><span class=\"sy0\">,<\/span> parent<span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;08-04-2025&quot;<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> split_placement<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;subrow&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">13<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Copywriting&quot;<\/span><span class=\"sy0\">,<\/span> &nbsp; parent<span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;04-04-2025&quot;<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">7<\/span> <span class=\"br0\">&#125;<\/span> <span class=\"co1\">\/\/ auto<\/span><\/div><\/div>\n<p>This gives you fine-grained control over dense timelines while keeping defaults convenient.<\/p>\n<h2>Multi-User Live Updates &#038; External Change Hooks<\/h2>\n<p>In modern project management solutions, collaborative editing becomes a necessity. Therefore, after being successfully battle-tested in Scheduler and Kanban components, this feature now comes to Gantt. To synchronize changes among multiple users in real time, we enriched the Gantt API with the new <strong>remoteEvents<\/strong> helper.<br \/>\nHere is how it works under the hood:<\/p>\n<ul>\n<li>The <strong>remoteEvents<\/strong> helper establishes a connection between the Gantt chart and a compatible backend via WebSocket.<\/li>\n<li>The DataProcessor sends any changes (e.g., adding or moving a task) via REST API.<\/li>\n<li>The server then broadcasts all changes to users, keeping everyone&#8217;s Gantt chart in sync.<\/li>\n<\/ul>\n<p>Additionally, you can use this approach to receive updates from external data sources in real time (e.g., from Firebase).  For more information, refer to the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__multiuser_live_updates.html\" rel=\"noopener\" target=\"_blank\">Live Updates<\/a> guide in the documentation.<\/p>\n<p>This <a href=\"https:\/\/github.com\/DHTMLX\/firebase-gantt-demo\/\" rel=\"noopener\" target=\"_blank\">GitHub example<\/a> shows how to use the new functionality for connecting DHTMLX Gantt to the Firestore backend.<\/p>\n<h2>New Lightbox Control for Resource Assignments<\/h2>\n<p>The updated Gantt also touches on another important aspect of project management, such as resource allocation. In v9.1, we added a more functional <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__resource_assignments.html\" rel=\"noopener\" target=\"_blank\">resource assignment control<\/a> to the lightbox. The new control allows specifying multiple uses of resources (employees, equipment, etc.) within a single task.<\/p>\n<p>Technically, it uses the same Grid module that is utilized by the left-hand panel of our Gantt and accepts the same <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__specifying_columns.html\" rel=\"noopener\" target=\"_blank\">configuration and templates<\/a>. Therefore, you can customize columns displayed in the assignments list and make columns editable via inline editors.<\/p>\n<p>As a result, you can not only style the assignments list as desired, but also enable end-users to easily adjust the duration and mode of assignments so they can create partial assignments where a resource is allocated only to <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__resource_management.html#assigningresources:~:text=Setting%20the%20time%20of%20the%20resource%20assignments\" rel=\"noopener\" target=\"_blank\">certain dates within the task<\/a>. For instance, there is a task that takes 7 days, so you can assign John to work on this task for the first two days, while Anna can be added to complete it.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image5.png\" alt=\"new resource assignment control in  Lightbox\" width=\"1842\" height=\"802\" class=\"aligncenter size-full wp-image-14599\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image5.png 1842w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image5-300x131.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image5-768x334.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2025\/11\/image5-1024x446.png 1024w\" sizes=\"auto, (max-width: 1842px) 100vw, 1842px\" \/><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/samples\/11_resources\/11_resource_histogram_display_tasks.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/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\">lightbox<\/span>.<span class=\"me1\">sections<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;description&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">38<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;textarea&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;text&quot;<\/span><span class=\"sy0\">,<\/span> focus<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;time&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;auto&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;assignments&quot;<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;resourcePeriods&quot;<\/span><span class=\"sy0\">,<\/span> map_to<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;assignments&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">120<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Thus, it becomes easier to handle partial allocations, replacements, and handovers both for developers (when configuring) and end-users (when editing assignments).<\/p>\n<h2>Updated Calendar Configuration<\/h2>\n<p>Previously, when you wanted to define a working calendar in DHTMLX Gantt, first, you had to create the calendar, then set working times. From now on, you can use the updated <strong><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_addcalendar.html\" rel=\"noopener\" target=\"_blank\">gantt.addCalendar()<\/a><\/strong> method to define default working hours for weekdays, specific dates (day off, shortened working day, etc.), and custom weeks in one config.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">addCalendar<\/span><span class=\"br0\">&#40;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;myCalendar&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&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> <span class=\"co1\">\/\/ global work hours for weekdays<\/span><br \/>\n&nbsp; &nbsp; days<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; weekdays<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\">1<\/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=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ working week days from Sunday to Monday<\/span><br \/>\n&nbsp; &nbsp; &nbsp; dates<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;2025-04-06&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> &nbsp;<span class=\"co1\">\/\/ override work hours for a specific date<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;2025-04-08&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;2025-04-09&quot;<\/span><span class=\"sy0\">:<\/span> &nbsp;<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;9:00-15:00&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h2>Single Configuration Object for Auto-Scheduling<\/h2>\n<p>DHTMLX Gantt 9.1 brings together scattered auto-scheduling settings in a single, centralized object called <strong>gantt.config.auto_scheduling<\/strong>:<\/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\">auto_scheduling<\/span> &nbsp;<span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;enabled<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;apply_constraints<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;show_constraints<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;project_constraint<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><em><strong>Note:<\/strong> The legacy configs are still available.<\/em><\/p>\n<p>Learn more about the new configuration object in the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/api__gantt_auto_scheduling_config.html\" rel=\"noopener\" target=\"_blank\">documentation<\/a>.<\/p>\n<h2>Other Improvements<\/h2>\n<p>Lastly, we would like to mention several minor changes and improvements delivered in v9.1:<\/p>\n<ul>\n<li>Improved touch support on Windows-based devices<\/li>\n<li>The Gantt project exported to Excel can now display split tasks<\/li>\n<li>Obsolete subscales API (gantt.config.subscales) has been removed<\/li>\n<\/ul>\n<p>That\u2019s all about the new capabilities introduced in DHTMLX Gantt 9.1. Check out the &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/gantt\/whatsnew.html#91\" rel=\"noopener\" target=\"_blank\">What\u2019s new<\/a>&#8221; section for a more detailed overview of the novelties. In the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/migrating.html#9091\" rel=\"noopener\" target=\"_blank\">migration notes<\/a>, you can find the information about the new recommended format of the auto-scheduling configuration. <\/p>\n<p><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" rel=\"noopener\" target=\"_blank\">Download a free 30-day trial version<\/a> to test the updated DHTMLX Gantt in your scenarios. Our current clients can access DHTMLX Gantt 9.1 via their <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client\u2019s Area<\/a>.<\/p>\n<h2>Related Materials<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/whatsnew.html#91\" rel=\"noopener\" target=\"_blank\">What\u2019s new in v9.1<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/gantt\/demos\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/download.shtml\" rel=\"noopener\" target=\"_blank\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>When having conversations with our current customers, we often ask them what they would like to see in a new version of our products. They often do not have &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":14602,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,20,56],"class_list":["post-14593","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-gantt","tag-react"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/14593","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=14593"}],"version-history":[{"count":13,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/14593\/revisions"}],"predecessor-version":[{"id":15893,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/14593\/revisions\/15893"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/14602"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=14593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=14593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=14593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}