{"id":15072,"date":"2026-02-17T13:13:35","date_gmt":"2026-02-17T10:13:35","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=15072"},"modified":"2026-05-13T12:24:54","modified_gmt":"2026-05-13T09:24:54","slug":"dhtmlx-suite-9-3","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-suite-9-3\/","title":{"rendered":"DHTMLX Suite 9.3: Advanced Grid Export, New Date Filter, and Other Useful Configuration Options"},"content":{"rendered":"<p>Today, we are releasing the first update of our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/\" rel=\"noopener\" target=\"_blank\">JavaScript UI widgets library<\/a> in 2026. The new DHTMLX Suite 9.3 further extends the configuration capabilities of the Grid component with more flexible export to popular formats, a new date filter type for columns, adjustable drag-and-drop behavior in the TreeMode, and better control over footer positioning. <\/p>\n<p>Other Suite widgets also received useful updates: Tree now supports customizable tooltips for items, while Window allows you to programmatically set the active state of windows.<\/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 Suite v9.3<\/div>\n\t\t            <div class=\"post-banner__text\">Estimate the updated functionality for building modern data-intensive apps<\/div>\n                <\/div>\n\t\t            \n                \n            <div class='post-banner__btn'>\n                <a href='https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/download.shtml' title='' class='button-secondary'>Get free trial<\/a>\n            <\/div>\n        \n            <\/div>\n\t\t<\/div>\n\t\n<p>In this blog post, we\u2019ll take a closer look at what\u2019s new in v9.3.<\/p>\n<h2>Highly Configurable Grid Export<\/h2>\n<p>The DHTMLX <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGrid\/\" rel=\"noopener\" target=\"_blank\">JavaScript DataGrid component<\/a> offers a wide range of configuration options for presenting tabular data on a web page. With Suite 9.3, we set out to bring a similar high level of flexibility to Grid export. And now exporting Grid data has become as configurable as displaying it. <\/p>\n<p>To extend the capabilities of the standard export, you\u2019ll need the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_exportconfig_config\/\" rel=\"noopener\" target=\"_blank\">exportConfig<\/a><\/strong> property, which is now available in the Grid API. This callback function receives the current Grid configuration (<strong>config<\/strong>) and the selected export format (<strong>exportType<\/strong>) and returns an export configuration object. The object includes parameters for defining changes that should be reflected in the exported file:<\/p>\n<ul>\n<li><strong>columns<\/strong> &#8211; column transformations<\/li>\n<li><strong>data<\/strong> &#8211; filtering or modifying row data<\/li>\n<li><strong>spans<\/strong> &#8211; cell merging manipulations<\/li>\n<li><strong>typeConfig<\/strong> &#8211; format-specific settings (filenames, delimiters, themes)<\/li>\n<li><strong>Grid properties<\/strong> &#8211; any Grid property (set as a <strong>key:value<\/strong> pair) that should be modified in the exported file<\/li>\n<\/ul>\n<p>Now, let us consider the main scenarios of how the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_exportconfig_config\/\" rel=\"noopener\" target=\"_blank\">exportConfig<\/a><\/strong> property helps dynamically change the structure and content of the resulting grid table in CSV, Excel, PDF, and PNG formats using code snippets from this <a href=\"https:\/\/snippet.dhtmlx.com\/aher21cg?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">new sample<\/a>: <\/p>\n<ul>\n<li>Data filtering <\/li>\n<\/ul>\n<p>In practice, it is not always necessary to export all grid data for further usage in different formats. The <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_exportconfig_config\/\" rel=\"noopener\" target=\"_blank\">exportConfig<\/a><\/strong> property allows you to decide if specific columns, rows, or spans should not be included in the final export file. <\/p>\n<p>For instance, if grid columns or rows contain confidential or excessive information, you can exclude this kind of data from export files by specifying filter conditions and returning <strong>null<\/strong> in the corresponding callback methods.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">exportConfig<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>config<span class=\"sy0\">,<\/span> exportType<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Column transformation<\/span><br \/>\n&nbsp; &nbsp; columns<span class=\"sy0\">:<\/span> column <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Completely exclude the &quot;experience_level&quot; column from any export<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>column.<span class=\"me1\">id<\/span> <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;experience_level&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ For spreadsheet formats (Excel\/CSV), keep columns as is<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;xlsx&quot;<\/span> <span class=\"sy0\">||<\/span> exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;csv&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> column<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ For PDF\/PNG, remove HTML templates and uppercase the headers<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; column.<span class=\"me1\">template<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; column.<span class=\"me1\">header<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> column.<span class=\"me1\">header<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">text<\/span>.<span class=\"me1\">toUpperCase<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> column<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Row data filtering<\/span><br \/>\n&nbsp; &nbsp; data<span class=\"sy0\">:<\/span> row <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Exclude young animals (age &lt;= 3) from the export<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>row.<span class=\"me1\">animal_age<\/span> <span class=\"sy0\">&lt;=<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Business logic example: do not export Dogs to CSV and Cats to Excel<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;csv&quot;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> row.<span class=\"me1\">animal_type<\/span> <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;Dog&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;xlsx&quot;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> row.<span class=\"me1\">animal_type<\/span> <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;Cat&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> row<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p>As you can see from the code above, conditions can be applied to all export formats or to specific ones.<\/p>\n<p>The same approach works for spans:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">exportConfig<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>config<span class=\"sy0\">,<\/span> exportType<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;spans<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>span<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\">\/\/ Exclude cells' merges when exporting to CSV,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/ as the CSV format does not support merged cells<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;csv&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"kw1\">return<\/span> span<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/div>\n<ul>\n<li>Content transformation<\/li>\n<\/ul>\n<p>The <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_exportconfig_config\/\" rel=\"noopener\" target=\"_blank\">exportConfig<\/a><\/strong> property helps you define not only what to display in the exported grid file but also how to do it. That\u2019s how easy you can remove column HTML templates and uppercase headers for PDF and PNG formats, while preserving the original columns\u2019 appearance for Excel and CSV:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ For spreadsheet formats (Excel\/CSV), keep columns as is<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;xlsx&quot;<\/span> <span class=\"sy0\">||<\/span> exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;csv&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> column<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ For PDF\/PNG, remove HTML templates and uppercase the headers<\/span><br \/>\ncolumn.<span class=\"me1\">template<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\ncolumn.<span class=\"me1\">header<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">text<\/span> <span class=\"sy0\">=<\/span> column.<span class=\"me1\">header<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.<span class=\"me1\">text<\/span>.<span class=\"me1\">toUpperCase<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">return<\/span> column<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<ul>\n<li>Styling adjustments<\/li>\n<\/ul>\n<p>Taking advantage of the ability to override any Grid property, you can change the way the Grid table looks in the exported file. Here is how to modify the header height specifically for the Excel file using <strong>headerRowHeight<\/strong>:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">headerRowHeight<span class=\"sy0\">:<\/span> exportType <span class=\"sy0\">===<\/span> <span class=\"st0\">&quot;xlsx&quot;<\/span> <span class=\"sy0\">?<\/span> <span class=\"nu0\">60<\/span> <span class=\"sy0\">:<\/span> config.<span class=\"me1\">headerRowHeight<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<ul>\n<li>Format-specific settings<\/li>\n<\/ul>\n<p>Using the <strong>typeConfig<\/strong> property in the <strong>exportConfig<\/strong> configuration object, you can go much further and specify unique settings for specific formats:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> exportConfig <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;csv<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;cat_report&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ Resulting CSV filename<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;rowDelimiter<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;<span class=\"es0\">\\t<\/span>&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ Use Tab as row delimiter<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;columnDelimiter<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;;&quot;<\/span> <span class=\"co1\">\/\/ Use Semicolon as column delimiter<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;xlsx<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dog_report&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ Resulting Excel filename<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;tableName<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Main Report&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ Sheet name in the Excel workbook<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;dateFormatMask<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dd.mm.yyyy&quot;<\/span> <span class=\"co1\">\/\/ Excel-specific date format mask<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;pdf<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;theme<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dark&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ Apply the dark theme to the PDF document<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;scale<span class=\"sy0\">:<\/span> <span class=\"nu0\">0.8<\/span><span class=\"sy0\">,<\/span> &nbsp; <span class=\"co1\">\/\/ Content scaling (80%)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;A4&quot;<\/span> &nbsp;<span class=\"co1\">\/\/ Page format<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> grid <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Grid<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;grid_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;columns<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/ columns config<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;data<span class=\"sy0\">:<\/span>dataset<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;exportConfig<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>config<span class=\"sy0\">,<\/span> exportType<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/ Pass settings from our object based on the export type<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;typeConfig<span class=\"sy0\">:<\/span> exportConfig<span class=\"br0\">&#91;<\/span>exportType<span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>As you can see, the code above adds CSV delimiters, Excel date masks, and a dark theme for PDF. <\/p>\n<p>Overall, the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_exportconfig_config\/\" rel=\"noopener\" target=\"_blank\">exportConfig<\/a><\/strong> property is a powerful addition to the Grid export API, offering great opportunities to create meaningful reports with only the essential insights from the data table displayed in the UI.<\/p>\n<p>Concluding the topic of data export, we would like to mention that export functions in Grid and Chart components now return a promise of data export.<\/p>\n<h2>New Filter Type for Grid Columns<\/h2>\n<p>Data filtering is one of the core features for effective data management. That is why our team continues empowering this already robust functionality with valuable enhancements. In v9.3, we\u2019ve extended the list of <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#headerfooter-filters\" rel=\"noopener\" target=\"_blank\">available filtering options<\/a> with the new <strong>dateFilter<\/strong> type. It allows end-users to filter records by a specific date (single mode) or date ranges (range mode) via a calendar view built with the corresponding <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxCalendar\/\" rel=\"noopener\" target=\"_blank\">Suite widget<\/a>.<\/p>\n<p>The single mode is used by default, while the range mode can be enabled in the <strong>filterConfig<\/strong> object by setting the value of the <strong>range<\/strong> parameter to <em>true<\/em>. Also, there are other configuration parameters for <strong>dateFilter<\/strong>, such as date format and placeholder. That\u2019s how to put it all together:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;receivedDate&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;minWidth<span class=\"sy0\">:<\/span> <span class=\"nu0\">200<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;date&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;dateFormat<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;%d.%m.%Y&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Received Date&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;content<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;dateFilter&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filterConfig<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;placeholder<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Select date&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;range<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/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> <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/image5.gif\" alt=\"Grid with date filter\" width=\"1856\" height=\"820\" class=\"aligncenter size-full wp-image-15081\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/kkr558qr?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>If custom logic is needed, it can be applied to any filter type, including <strong>dateFilter<\/strong>, by setting the <strong>customFilter<\/strong> attribute when configuring the header\/footer content of the column. This <a href=\"https:\/\/snippet.dhtmlx.com\/p7h6qj4z?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">sample<\/a> includes custom conditional logic for <strong>dateFilter<\/strong>.<\/p>\n<h2>Fine-Tuned Drag-and-Drop Behavior in Grid\u2019s TreeGrid Mode<\/h2>\n<p>DHTMLX Grid provides a TreeGrid mode that allows presenting data as hierarchical structures and reordering them with drag-and-drop. However, each use case may require different rules for reorganizing hierarchies. To help you address various requests related to the drag-and-drop behavior in TreeGrid mode, we\u2019ve introduced a new configuration option &#8211; <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_dropbehaviour_config\/\" rel=\"noopener\" target=\"_blank\">dropBehaviour<\/a><\/strong>.<\/p>\n<p>Inherited from the Tree widget, this new Grid property allows specifying how a dragged item (row) is placed relative to a target item. It offers three modes for dropping dragged items, namely sibling-level reordering, child nesting, and combined (complex) behavior (default option).<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> grid <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Grid<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;treegrid&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; type<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;tree&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; columns<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; ...<span class=\"co1\">\/\/column configuration<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; data<span class=\"sy0\">:<\/span> dataset<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; autoWidth<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; dragItem<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;both&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; dropBehaviour<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;complex&quot;<\/span> <span class=\"co1\">\/\/ enables one of the drop modes &quot;child&quot; | &quot;sibling&quot; | &quot;complex&quot; (default)<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/image4.gif\" alt=\"Footer positioning\" width=\"1139\" height=\"599\" class=\"aligncenter size-full wp-image-15078\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/o2v3pcg0?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>With this novelty, you get more precise control over hierarchical structures in the TreeGrid mode.<\/p>\n<h2>New Footer Positioning Logic<\/h2>\n<p>The updated Grid component provides an extra layout control for footers and bottom-pinned (frozen) rows of the data table. For this purpose, the Grid API now includes the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_footerposition_config\/\" rel=\"noopener\" target=\"_blank\">footerPosition<\/a><\/strong> property. It offers <strong>relative<\/strong> (default value) and <strong>bottom<\/strong> values that determine the positioning of the footer and bottom-pinned rows. By default, the footer\/frozen row immediately follows the Grid content. After changing the value of <strong>footerPosition<\/strong> to <strong>bottom<\/strong>, the footer\/frozen row stays fixed at the bottom of the container, like in the example below: <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/Footer-positioning.png\" alt=\"Footer positioning\" width=\"850\" height=\"660\" class=\"aligncenter size-full wp-image-15077\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/Footer-positioning.png 850w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/Footer-positioning-300x233.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/Footer-positioning-768x596.png 768w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/w5xzdjb7?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>Regardless of the amount of data in the grid table, footers and frozen rows will be rendered according to the specified setting. <\/p>\n<h2>Customizable Tooltips for Tree Items<\/h2>\n<p>The Suite&#8217;s <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxTree\/\" rel=\"noopener\" target=\"_blank\">Tree widget<\/a> is a reliable tool for building tree-like structures on a web page. Now, you have an opportunity to complement your Tree-based hierarchies with informative tooltips.<\/p>\n<p>The new Suite 9.3 comes with the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/tree\/api\/tree_tooltip_config\/\" rel=\"noopener\" target=\"_blank\">tooltip<\/a><\/strong> property that ensures flexible tooltip configuration for Tree items. To be more specific, this property allows enabling a standard tooltip, defining custom tooltip content with a function, and most interestingly, applying an object configuration for advanced tooltip customization.<\/p>\n<p>While the standard tooltip is clear and predictably displays the value of an item, two other options require clarification with examples.<\/p>\n<p>Here is a function-based approach to defining a tooltip:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> tree <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Tree<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;tree_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;tooltip<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>item<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#40;<\/span>item.<span class=\"me1\">value<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span>item.<span class=\"me1\">items<\/span> <span class=\"sy0\">?<\/span> ` <span class=\"br0\">&#40;<\/span>$<span class=\"br0\">&#123;<\/span>item.<span class=\"me1\">items<\/span><span class=\"sy0\">?<\/span>.<span class=\"me1\">length<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span>` <span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>In this example, the function returns a string that will show the item value and the number of its child items, if they exist. But what if you need to specify not only the tooltip content, but also its behavior and styling?<\/p>\n<p>In this case, you can resort to the object configuration in the tooltip property, providing the ability to flexibly customize the tooltip\u2019s content, appearance, delay, and positioning:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> tree <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Tree<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;tree&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; tooltip<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; htmlEnable<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Delay 100ms before showing<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; showDelay<span class=\"sy0\">:<\/span> <span class=\"nu0\">100<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ The tooltip will appear to the top of the item<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; position<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;top&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ &quot;right&quot; | &quot;bottom&quot; (default) | &quot;center&quot; | &quot;left&quot; | &quot;top&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ CSS class for styling<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;custom-tooltip-style&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Template function<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; template<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>item<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> item.<span class=\"me1\">items<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">?<\/span> `<span class=\"sy0\">&lt;<\/span>b<span class=\"sy0\">&gt;<\/span>$<span class=\"br0\">&#123;<\/span>item.<span class=\"me1\">value<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>b<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>$<span class=\"br0\">&#123;<\/span>item.<span class=\"me1\">items<\/span>.<span class=\"me1\">length<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span>` <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">:<\/span> `<span class=\"sy0\">&lt;<\/span>b<span class=\"sy0\">&gt;<\/span>$<span class=\"br0\">&#123;<\/span>item.<span class=\"me1\">value<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;\/<\/span>b<span class=\"sy0\">&gt;&lt;<\/span>br<span class=\"sy0\">\/&gt;<\/span>Size<span class=\"sy0\">:<\/span> $<span class=\"br0\">&#123;<\/span>item.<span class=\"me1\">size<\/span> <span class=\"sy0\">||<\/span> <span class=\"st0\">&quot;N\/A&quot;<\/span><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><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/02\/ezgif.com-crop-1.gif\" alt=\"Tree with custom tooltip\" width=\"476\" height=\"314\" class=\"alignleft size-full wp-image-15089\" \/><br \/>\n<a href=\"https:\/\/snippet.dhtmlx.com\/kswil8cl?tag=tree&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<h2>Active State Option for Window Widget<\/h2>\n<p>If your web application should include multiple overlapping windows on a single page, the Window widget from our Suite is exactly what you need, especially after a useful improvement delivered in v9.3. The novelty lies in the possibility of activating a currently overlapped window and bringing it to the foreground. It is done programmatically via the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/window\/api\/window_setactive_method\/\" rel=\"noopener\" target=\"_blank\">setActive()<\/a><\/strong> method, the operating principle of which is shown in the basic example with two windows below:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> window1 <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Window<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;...<span class=\"me1\">windowConfig<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;title<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Window 1&quot;<\/span><span class=\"sy0\">,<\/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> window2 <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Window<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;...<span class=\"me1\">windowConfig<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;title<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Window 2&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ displaying both windows<\/span><br \/>\nwindow1.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nwindow2.<span class=\"me1\">show<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ Window 2 is currently on top<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ bringing Window 1 to the front without refreshing its content<\/span><br \/>\nwindow1.<span class=\"me1\">setActive<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><a href=\"https:\/\/snippet.dhtmlx.com\/lvm3kfwq?tag=window&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>Thanks to the use of <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/window\/api\/window_setactive_method\/\" rel=\"noopener\" target=\"_blank\">setActive()<\/a><\/strong>, you can update the window stacking order without rerendering the content. <\/p>\n<p>That\u2019s all about the updates included in DHTMLX Suite 9.3. The complete list of new features is also available for a quick review in the &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/suite\/whatsnew\/#version-93\" rel=\"noopener\" target=\"_blank\">What\u2019s New<\/a>&#8221; section of the Suite documentation.<\/p>\n<p>Between the releases of DHTMLX Suite 9.2 and 9.3, our team devoted considerable attention to the question of using Suite widgets and other DHTMLX products with AI technologies. As a result, we created two demo apps &#8211; <a href=\"https:\/\/dhtmlx.com\/docs\/demo\/grid-ai-review-analysis\/\" rel=\"noopener\" target=\"_blank\">AI Review Analysis<\/a> and <a href=\"https:\/\/docs.dhtmlx.com\/docs\/demo\/form-builder-ai\/\" rel=\"noopener\" target=\"_blank\">AI Form Builder<\/a>. They vividly demonstrate how AI can boost the efficiency of tools built with DHTMLX Grid and Form. Moreover, we also launched the <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlx-mcp-server\/\" rel=\"noopener\" target=\"_blank\">DHTMLX MCP server<\/a> designed to facilitate your experience with the DHTMLX documentation via popular AI assistants. <\/p>\n<p>For those who want to see how new features prove their worth in real-case scenarios, download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> and get down to testing. Existing customers can access DHTMLX Suite 9.3 from 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\/suite\/whatsnew\/#version-93\" rel=\"noopener\" target=\"_blank\">What\u2019s new in v9.3<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/suite\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Suite documentation<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/aher21cg?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">DHTMLX Suite samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/download.shtml\" rel=\"noopener\" target=\"_blank\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Today, we are releasing the first update of our JavaScript UI widgets library in 2026. The new DHTMLX Suite 9.3 further extends the configuration capabilities of the Grid component &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":15075,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,10],"class_list":["post-15072","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-dhtmlxsuite"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15072","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=15072"}],"version-history":[{"count":13,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15072\/revisions"}],"predecessor-version":[{"id":15094,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15072\/revisions\/15094"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/15075"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=15072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=15072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=15072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}