{"id":10198,"date":"2022-05-19T13:23:33","date_gmt":"2022-05-19T10:23:33","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=10198"},"modified":"2024-08-16T12:22:25","modified_gmt":"2024-08-16T09:22:25","slug":"dhtmlx-scheduler-6-0","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-scheduler-6-0\/","title":{"rendered":"DHTMLX Scheduler 6.0 with ES6 Module Support, Destructors, New Timeline Features, Enhanced DataProcessor and API"},"content":{"rendered":"<p>We are happy to announce a highly anticipated release of DHTMLX Scheduler 6.0. When working on this quality-of-life update, our development team primarily focused on making the <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\" rel=\"noopener\" target=\"_blank\">JavaScript scheduling component<\/a> more developer-friendly. We have updated the package structure and TypeScript definitions, cleaned up legacy modules, and provided some long-awaited features. For instance, the new version comes with the modified API providing additional useful capabilities. Among them are a long-overdue destructor for the scheduler instance, updated dataProcessor for simpler integrations, and a couple of new useful features for the popular Timeline view. <\/p>\n<p>Besides, we have simplified the work with extensions and locales making integration of the Scheduler library with popular JavaScript frameworks easier. We have also ensured compatibility with Salesforce LWC.<\/p>\n<p><strong><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" rel=\"noopener\" target=\"_blank\">Evaluate the new version 6.0 of DHTMLX Scheduler ><\/a><br \/>\n<\/strong><br \/>\nLet us consider all these novelties in more detail.<\/p>\n<h5>Updated Package Structure with ES6 Module Support<\/h5>\n<p>High usability is one of the determining factors for productive work with JavaScript libraries, and we&#8217;ve made a big step forward in this direction in v6.0. From now on, you can easily <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/initialization.html#importfilesintoes67andtypescriptapps\" rel=\"noopener\" target=\"_blank\">import Scheduler as an ES6 module<\/a> without the need for declaring global objects.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> scheduler<span class=\"sy0\">,<\/span> Scheduler <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'dhtmlx-scheduler'<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>All extensions have been included in the main file of the Scheduler component and now are enabled with the <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_plugins.html\" rel=\"noopener\" target=\"_blank\">plugins()<\/a><\/strong> method.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">plugins<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; limit<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; timeline<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; units<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/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>Another notable change is the removal of all locale files from the package. You can also benefit from the new API for the Scheduler localization added in this release. It provides the <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/localization.html\" rel=\"noopener\" target=\"_blank\">i18n<\/a><\/strong> object with an array of methods for enabling the required UI language.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">i18n<\/span>.<span class=\"me1\">setLocale<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;es&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Just like extensions, locales are now included in the <strong>dhtmlxscheduler.js<\/strong> file. Thus it will be really simple to activate them when needed.<\/p>\n<p>Custom locales and extensions that are defined in separate files can still be used.<\/p>\n<h5>Updated Routing Options for DataProcessor<\/h5>\n<p>The DataProcessor library is responsible for communicating with the server-side and tracking all changes in the Scheduler. It has been enriched with the ability to specify <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/server_integration.html#customrouting\" rel=\"noopener\" target=\"_blank\">custom routing options<\/a>. They provide you with a single point where you can capture all changes made in the Scheduler, allowing you to connect it to the rest of the application. Custom routing options are enabled with the help of the <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_createdataprocessor.html\" rel=\"noopener\" target=\"_blank\">createDataProcessor()<\/a><\/strong> method:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">createDataProcessor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; event<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; update<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>event<span class=\"sy0\">,<\/span> id<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ event has been updated<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; create<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ event has been created<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">new<\/span> Promise<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>resolve<span class=\"sy0\">,<\/span> reject<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ insert the event into the database<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ resolve with the permanent event id when done<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ ...<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resolve<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>id<span class=\"sy0\">:<\/span> databaseId<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ event has been deleted<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>It&#8217;s worth noting that the DataProcessor router format is compatible with the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__server_side.html#customrouting\" rel=\"noopener\" target=\"_blank\">DataProcessor of DHTMLX Gantt<\/a>, which means you use the same router object for both DHTMLX Scheduler and DHTMLX Gantt when both are used in the application.<\/p>\n<h5>Destructors for Scheduler and DataProcessor Instances<\/h5>\n<p>Another much-anticipated feature aimed to simplify the work of our Scheduler component in combination with top JavaScript frameworks (React, Angular, Vue.js) is the <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/multiple_per_page.html#destructorofscheduleranddataprocessorinstances\" rel=\"noopener\" target=\"_blank\"><strong>destructor()<\/strong> method for the Scheduler and DataProcessor<\/a>.<\/p>\n<p>When incorporating DHTMLX Scheduler into a SPA (Single Page Application), lacking a proper destructor was a major inconvenience for many of our users. We are glad to tell you that the newly added <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_destructor.html\" rel=\"noopener\" target=\"_blank\">destructor()<\/a><\/strong> method solves this problem. Instead of reusing the global instance of the Scheduler component, you can now create a new instance when the Scheduler must be activated and destroy it when it&#8217;s no longer needed:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Scheduler <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;dhtmlx-scheduler&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> SchedulerComponent <span class=\"kw5\">implements<\/span> OnInit <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">@<\/span>ViewChild<span class=\"br0\">&#40;<\/span><span class=\"st0\">'scheduler_here'<\/span><span class=\"br0\">&#41;<\/span> schedulerContainer<span class=\"sy0\">:<\/span> ElementRef<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>private calendarEventService<span class=\"sy0\">:<\/span> CalendarEventService<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; ngOnInit<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> scheduler <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.$scheduler <span class=\"sy0\">=<\/span> Scheduler.<span class=\"me1\">getSchedulerInstance<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">schedulerContainer<\/span>.<span class=\"me1\">nativeElement<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">createDataProcessor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> CalendarEvent<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">update<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; create<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> CalendarEvent<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>events<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span>events<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; ngOnDestroy<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.$scheduler.<span class=\"me1\">destructor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">this<\/span>.$scheduler <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_destructor.html\" rel=\"noopener\" target=\"_blank\">destructor()<\/a><\/strong> method can also be applied for clearing the dataProcessor instance and detaching it from the Scheduler.<\/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> dataProcesor <span class=\"sy0\">=<\/span> scheduler.<span class=\"me1\">createDataProcessor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; event<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; update<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> CalendarEvent<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">update<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; create<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> CalendarEvent<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">calendarEventService<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/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&nbsp;<br \/>\n...<br \/>\n&nbsp;<br \/>\n<span class=\"me1\">dataProcessor<\/span>.<span class=\"me1\">destructor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h5>New Capabilities in Timeline View<\/h5>\n<p>The <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/timeline_view.html\" rel=\"noopener\" target=\"_blank\">Timeline view <\/a>is the most widely used view of our Scheduler that serves for presenting any kind of project activities assigned to project resources and monitoring their progress. In v6.0, we&#8217;ve introduced several new customization options that will make this view more configurable and convenient to use. <\/p>\n<ul>\n<li>A new <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/timeline_view.html#:~:text=Specifying%20columns%20of%20the%20left%2Dhand%20panel\" rel=\"noopener\" target=\"_blank\">setting for specifying columns<\/a> in the left panel of the timeline<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image4.png\" alt=\"Timeline view - new setting\" width=\"904\" height=\"433\" class=\"aligncenter size-full wp-image-10201\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image4.png 904w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image4-300x144.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image4-768x368.png 768w\" sizes=\"auto, (max-width: 904px) 100vw, 904px\" \/><\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">createTimelineView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; name<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;timeline&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; ...<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; columns<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Room Number&quot;<\/span><span class=\"sy0\">,<\/span>template<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>section<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> section.<span class=\"me1\">roomNumber<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Type&quot;<\/span><span class=\"sy0\">,<\/span> width<span class=\"sy0\">:<\/span> <span class=\"nu0\">50<\/span><span class=\"sy0\">,<\/span> template<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>section<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> section.<span class=\"me1\">roomType<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;State&quot;<\/span><span class=\"sy0\">,<\/span> width<span class=\"sy0\">:<\/span> <span class=\"nu0\">120<\/span><span class=\"sy0\">,<\/span> template<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>section<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> section.<span class=\"me1\">roomState<\/span><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><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/samples\/06_timeline\/19_columns_sidebar.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<ul>\n<li>The ability to <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/timeline_view.html#changingheightsofsections\" rel=\"noopener\" target=\"_blank\">set the height for sections<\/a> of the timeline<\/li>\n<\/ul>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">serverList<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;rooms&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Room 1&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">120<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Room 2&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">60<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Room 3&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">60<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span>key<span class=\"sy0\">:<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> label<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Room 4&quot;<\/span><span class=\"sy0\">,<\/span> height<span class=\"sy0\">:<\/span> <span class=\"nu0\">60<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>It also allows changing the height of the sections dynamically, so you could implement the \u201ccondensed\u201d view of the section like in the example below:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image2.gif\" alt=\"Timeline view - setting height for sections\" width=\"916\" height=\"472\" class=\"aligncenter size-full wp-image-10204\" \/><\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">attachEvent<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;onYScaleClick&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">function<\/span> <span class=\"br0\">&#40;<\/span>index<span class=\"sy0\">,<\/span> section<span class=\"sy0\">,<\/span> e<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>scheduler.<span class=\"me1\">utils<\/span>.<span class=\"me1\">dom<\/span>.<span class=\"me1\">closest<\/span><span class=\"br0\">&#40;<\/span>e.<span class=\"me1\">target<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;.timeline-section-collapse&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; section.<span class=\"me1\">collapsed<\/span> <span class=\"sy0\">=<\/span> <span class=\"sy0\">!<\/span>section.<span class=\"me1\">collapsed<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>section.<span class=\"me1\">collapsed<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; section.<span class=\"me1\">height<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">25<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"kw1\">else<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; section.<span class=\"me1\">height<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">120<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scheduler.<span class=\"me1\">setCurrentView<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/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><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/samples\/06_timeline\/18_collapse_section.html\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<ul>\n<li>The ability to programmatically control the rendering position of timeline events using <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/timeline_view.html#:~:text=timeline.resolvePosition\" rel=\"noopener\" target=\"_blank\">numerous added methods<\/a>. It can be very useful for performing project-specific customizations based on the Timeline view.<\/li>\n<\/ul>\n<h5>Changes in Content Security Policy<\/h5>\n<p>Starting from v6.0, it has become much easier to use the Scheduler component with Salesforce LWC or other apps in which Content Security Policy (CSP) is implemented. The previously utilized CSP extension has been removed from the package and replaced with the <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_csp_config.html\" rel=\"noopener\" target=\"_blank\">csp<\/a><\/strong> config that is enabled by default. Thus you won\u2019t need to apply any plugins to activate the csp mode.<\/p>\n<h5>Deprecated API<\/h5>\n<p>Some historical APIs and global objects have been deprecated and removed from the main package. Namely, the following global objects and functions are no longer declared in the library: <strong>dhtmlx<\/strong>, <strong>dhtmlxAjax<\/strong>, <strong>dhtmlDragAndDropObject<\/strong>, <strong>dhtmlxEventable<\/strong>.<\/p>\n<p>The updated package provides alternatives for most of these APIs, so the migration will consist of replacing method calls without rewriting the existing code.<\/p>\n<p>Please refer to the <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/migration_from_older_version.html\" rel=\"noopener\" target=\"_blank\">migration notes<\/a> for more information.<\/p>\n<h5>Other Improvements<\/h5>\n<p>Now it is time to go through other minor but helpful changes provided in v6.0.<\/p>\n<p>The <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/integration_with_dhtmlxmessage.html\" rel=\"noopener\" target=\"_blank\">Message widget<\/a>, embedded into DHTMLX Scheduler, has been updated to the latest version and moved from <strong>dhtmlx<\/strong> into <strong>scheduler<\/strong> object. The updated widget provides a simpler API for displaying modal windows with custom configurations and buttons:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image3-1024x427.png\" alt=\"DHTMLX Scheduler - message window\" width=\"1024\" height=\"427\" class=\"aligncenter size-large wp-image-10205\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image3-1024x427.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image3-300x125.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image3-768x321.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2022\/05\/image3.png 1289w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">modalbox<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; title<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Settings&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot; ... html code here... &quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; buttons<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Save&quot;<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;btn-save&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;save&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Cancel&quot;<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;btn-cancel&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;cancel&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> label<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;Delete&quot;<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;btn-delete&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;delete&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; callback<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>result<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;scheduler.<span class=\"me1\">message<\/span><span class=\"br0\">&#40;<\/span>result<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><a href=\"https:\/\/snippet.dhtmlx.com\/c9a0kiif\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>In addition to that, the Message plugin no longer conflicts with messages used in DHTMLX Suite 5 or DHTMLX Gantt when these libraries are used in the same app.<\/p>\n<p>Our team prepared a set of helper methods such as <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_assert.html\" rel=\"noopener\" target=\"_blank\">assert()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_bind.html\" rel=\"noopener\" target=\"_blank\">bind()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_copy.html\" rel=\"noopener\" target=\"_blank\">copy()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_defined.html\" rel=\"noopener\" target=\"_blank\">defined()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_mixin.html\" rel=\"noopener\" target=\"_blank\">mixin()<\/a><\/strong>, <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_env_other.html\" rel=\"noopener\" target=\"_blank\">env()<\/a><\/strong> to improve your experience with DHTMLX Scheduler. <\/p>\n<p>The <strong><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/api__scheduler_attachevent.html\" rel=\"noopener\" target=\"_blank\">attachEvent()<\/a><\/strong> method received the <strong>settings<\/strong> object as a new optional parameter that allows adding extra settings to the event handler.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">scheduler.<span class=\"me1\">attachEvent<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;onSchedulerReady&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; <span class=\"co1\">\/\/ apply settings when scheduler.init is called for the first time<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span>once<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>It is also worth mentioning that DHTMLX Scheduler is now very similar to our Gantt component in terms of API. It means that using both components in the same app becomes much easier since you&#8217;re able to use the same code style for both components, which will boost productivity and reduce the development time of complex applications.<\/p>\n<p>Get a deeper insight into this major update by visiting the \u201c<a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/what_s_new.html#60\" rel=\"noopener\" target=\"_blank\">What&#8217;s new<\/a>\u201d section of our documentation.<\/p>\n<p>This release is a significant milestone in the evolution of our JavaScript scheduling component. The novelties introduced in v6.0 will facilitate the process of adding new Scheduler features in future updates.<\/p>\n<p>Those who want to evaluate the practical value of new features offered in v6.0, download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> of our Scheduler library.<\/p>\n<p>Existing DHTMLX clients have an opportunity to get to the new version of the DHTMLX Scheduler in their <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client&#8217;s Area<\/a>.<\/p>\n<p>Feel free to share your impressions on DHTMLX Scheduler v6.0 in the comments below and follow our blog for new releases.<\/p>\n<h5>Related Materials:<\/h5>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/what_s_new.html#60\" rel=\"noopener\" target=\"_blank\">Full \u201cWhat\u2019s New\u201d list<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/samples\/index.html\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" rel=\"noopener\" target=\"_blank\">DHTMLX Scheduler free trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We are happy to announce a highly anticipated release of DHTMLX Scheduler 6.0. When working on this quality-of-life update, our development team primarily focused on making the JavaScript scheduling &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":10207,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,63,15],"class_list":["post-10198","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-salesforce","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/10198","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=10198"}],"version-history":[{"count":24,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/10198\/revisions"}],"predecessor-version":[{"id":12812,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/10198\/revisions\/12812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/10207"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=10198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=10198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=10198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}