{"id":13161,"date":"2024-11-26T12:12:07","date_gmt":"2024-11-26T09:12:07","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=13161"},"modified":"2024-12-17T17:37:34","modified_gmt":"2024-12-17T14:37:34","slug":"dhtmlx-suite-9-0","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-suite-9-0\/","title":{"rendered":"DHTMLX Suite 9.0: Grid Widget with Tree Mode, Data Grouping, Customizable Totals, Input Masks, and Much More"},"content":{"rendered":"<p>DHTMLX Grid has always been the ultimate driver of the Suite&#8217;s popularity among web developers. It enriched many business apps with numerous features required for effective presentation and manipulation of large data sets aligned with a user experience. The new v9.0 of our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/\" rel=\"noopener\" target=\"_blank\">JavaScript UI widgets library<\/a> comes with significant updates for this widget that will bring your data management capabilities to a new level.<\/p>\n<p>You won\u2019t find the TreeGrid widget in the new Suite version, because now it is a new Grid feature. But the pivotal novelty of this release is row data grouping with extensive customization options via API and UI. Another useful feature that will increase the value of the Grid widget in data analysis is the ability to use custom stats functions and define totals in the header\/footer of your table. In Grid and Form widgets, you can also contribute to enhanced usability during data entry by setting input masks.  <\/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.0<\/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>Let us consider the main features delivered in v9.0 in more detail.<\/p>\n<h5>TreeGrid Becomes a Part of Grid Widget (PRO)<\/h5>\n<p>DHTMLX TreeGrid has been an extension for the Grid widget, so they have always been very similar in terms of usage and API. That is why merging TreeGrid into Grid is a logical step that broadens the Grid\u2019s applicability in hierarchical data representation with expandable\/collapsible rows. There are other positive results such as unified functionality, faster development, and simplified maintenance. From a technical perspective, this measure is a crucial condition for the biggest feature of this release, namely data grouping, based on the tree structure.<\/p>\n<p>Now, the Grid API allows configuring <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGrid\/\" rel=\"noopener\" target=\"_blank\">JS data tables<\/a> to present flat and hierarchical structures. The <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#setting-the-treegrid-mode\" rel=\"noopener\" target=\"_blank\">tree mode<\/a> with all TreeGrid functionality is enabled with <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_type_config\/\" rel=\"noopener\" target=\"_blank\">type: &#8220;tree&#8221;<\/a><\/strong> in the Grid configuration:<\/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;grid_container&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; &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; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">400<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; data<span class=\"sy0\">:<\/span> dataset<br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>The new mode supports keyboard navigation to ensure convenient management of tree-like data structures with keys and shortcuts. <\/p>\n<h5>Flexible Row Data Grouping (PRO)<\/h5>\n<p>Starting from v9.0, DHTMLX Grid supports row data grouping. It is a killer feature of this major release designed to simplify the analysis of large datasets by organizing data hierarchically based on selected grouping criteria. Thus, it becomes a powerful tool to promptly notice valuable patterns and trends from aggregated data, facilitating more effective decision-making. <\/p>\n<p>The great thing is that this feature is implemented with high flexibility in mind, meaning that you can configure grouping according to any project needs. For this purpose, we enriched the Grid API with new properties that allow you to specify grouping details. <\/p>\n<p>The predefined grouping configuration is implemented via the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_group_config\/\" rel=\"noopener\" target=\"_blank\">group<\/a><\/strong> property. This property serves to specify the behavior, visibility, and appearance of groupings in the table. It also allows managing the group panel, columns\u2019 display, grouping order, and settings related to data aggregation.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/bandicam-2024-11-26-13-45-37-732.png\" alt=\"data grouping config \" width=\"1869\" height=\"849\" class=\"aligncenter size-full wp-image-13172\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/bandicam-2024-11-26-13-45-37-732.png 1869w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/bandicam-2024-11-26-13-45-37-732-300x136.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/bandicam-2024-11-26-13-45-37-732-768x349.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/bandicam-2024-11-26-13-45-37-732-1024x465.png 1024w\" sizes=\"auto, (max-width: 1869px) 100vw, 1869px\" \/><\/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;grid&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; columns<span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; group<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; order<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;shelter_location&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/more configuration options<\/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\/dvqy4ewe?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>The <strong>group<\/strong> configuration option contains many parameters that will help you modify grouping settings as desired. For instance, you can combine grouping with data aggregation. To do that, you need the <strong>fields<\/strong> parameter that sets up the extended configuration for data grouping by certain columns and specifies rules for aggregation and display of total values. The order of grouping is arranged in the corresponding <strong>order<\/strong> parameter.<\/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;grid&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=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;country&quot;<\/span><span class=\"sy0\">,<\/span> header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Country&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;population&quot;<\/span><span class=\"sy0\">,<\/span> header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Population&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;density&quot;<\/span><span class=\"sy0\">,<\/span> header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Density (P\/Km\u00b2)&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; group<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; panel<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; fields<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; population<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; summary<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;bottom&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; map<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; population<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;population&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;sum&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customSummary<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>rows<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> rows.<span class=\"me1\">length<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; order<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;population&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; data<span class=\"sy0\">:<\/span> dataset<br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>As for end-users&#8217; capabilities in grouping, they are immense. Want to give end-users full freedom in grouping data by values of one or multiple columns of the grid table? Just enable the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_groupable_config\/\" rel=\"noopener\" target=\"_blank\">groupable<\/a><\/strong> property in the <strong>grid<\/strong> config. You can also add the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_closable_config\/\" rel=\"noopener\" target=\"_blank\">closable<\/a><\/strong> property in this config, allowing users to remove any item from the grouping panel.<\/p>\n<p>In the UI, all that has to be done is simply drag the headers of needed columns into the grouping panel and Grid will automatically create groups based on the values in these columns. End-users can also edit the nesting level of the grouping by reordering items in the panel or removing ones that are no longer needed. The values of grouped columns are sortable.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/image4-1.gif\" alt=\"data grouping in the UI\" width=\"1872\" height=\"848\" class=\"aligncenter size-full wp-image-13168\" \/><\/p>\n<p>If grouping is only relevant for particular grid columns, you should add the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/api_gridcolumn_properties\/\" rel=\"noopener\" target=\"_blank\">groupable<\/a><\/strong> property (and <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/api_gridcolumn_properties\/\" rel=\"noopener\" target=\"_blank\">closable<\/a><\/strong>, if needed) to the config of the required column.<\/p>\n<p>Once the grouping feature is enabled in the Grid configuration, it also becomes available in the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/usage\/#using-datacollection-api-for-data-grouping\" rel=\"noopener\" target=\"_blank\">DataCollection API<\/a><\/strong>. In v9.0, it includes a range of new <a href=\"https:\/\/docs.dhtmlx.com\/suite\/data_collection\/\" rel=\"noopener\" target=\"_blank\">methods and events<\/a> for grouping items. For instance, you can group data and divide it into different categories:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/image2-1.gif\" alt=\"grouping via DataCollection\" width=\"1540\" height=\"852\" class=\"aligncenter size-full wp-image-13169\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/vo3pgkgh?mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>As a result, this big feature will help you to bridge the gap between raw data and actionable insights. <\/p>\n<h5>Summaries of Values Calculated with Custom Functions<\/h5>\n<p>Another great novelty delivered for DHTMLX Grid in this major release lies in the area of custom computing. Here we are talking about the ability to redefine the default stats functions and render the summaries of custom calculations for a certain column or the whole JS grid table. This will come in handy in scenarios, where predefined functions (sum, avg, etc.) are not enough. For instance, financial reports or scientific research may have specific data analysis needs that can be addressed with custom calculations and the updated Grid API empowers you to do that. <\/p>\n<p>The process of generating  data summaries in your JavaScript data table includes the following steps:<\/p>\n<p>1) Defining a function for calculation during the summary list creation.<br \/>\nFor this purpose, you need the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/helpers\/data_calculation_functions\/\" rel=\"noopener\" target=\"_blank\">dhx.methods<\/a><\/strong> helper that serves for defining default statistical functions or creating custom functions like the one below:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">dhx.<span class=\"me1\">methods<\/span>.<span class=\"me1\">doubleSum<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>rows<span class=\"sy0\">,<\/span> field<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> rows.<span class=\"me1\">reduce<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>sum<span class=\"sy0\">,<\/span> row<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> sum <span class=\"sy0\">+<\/span> row<span class=\"br0\">&#91;<\/span>field<span class=\"br0\">&#93;<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>2) Forming a summary list on the required level.<\/p>\n<p>You can create summaries for a particular <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#column-summary\" rel=\"noopener\" target=\"_blank\">column<\/a> or the <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#grid-summary\" rel=\"noopener\" target=\"_blank\">whole data table<\/a>: <\/p>\n<ul>\n<li>For a column, you should use the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/api_gridcolumn_properties\/\" rel=\"noopener\" target=\"_blank\">summary<\/a><\/strong> property to initialize the summary (as an object or a string) in the Grid column configuration.<\/li>\n<li>For the summary that will cover the whole table, you need the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_summary_config\/\" rel=\"noopener\" target=\"_blank\">summary<\/a><\/strong> config option of Grid.<\/li>\n<\/ul>\n<p>To render custom statistics in column and grid summaries, it is necessary to set the <strong>text<\/strong> and <strong>tooltipTemplate<\/strong> properties of a column and of the Grid <strong>spans<\/strong> configuration object as callback functions. <\/p>\n<p>3) Getting the summary object with the calculated values.<br \/>\nThe Grid API now includes the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/api\/grid_getsummary_method\/\" rel=\"noopener\" target=\"_blank\">getSummary()<\/a><\/strong> method that can be used to <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#getting-the-summary-object\" rel=\"noopener\" target=\"_blank\">get the summary data<\/a> for the whole grid or a certain column. If you call the method without any parameters, you\u2019ll get the summary for the whole Grid. After specifying the <strong>id<\/strong> parameter, you\u2019ll get summaries for both column and grid.<\/p>\n<p>Such customizations enhance the usability of DHTMLX Grid in applications requiring complex calculations.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2024\/11\/image3-1.gif\" alt=\"Grid - custom totals\" width=\"1853\" height=\"661\" class=\"aligncenter size-full wp-image-13170\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/59d6hqtm?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>In this sample, you can see how these new capabilities can be applied in a real-case scenario with dynamic updates after editing.<\/p>\n<h5>Enhanced Accuracy with Input Masks in Grid and Form<\/h5>\n<p>When working with complex tables, end-users may need to enter data in a certain format (dates, phone, numbers, credit card details, etc.) and errors are likely to occur. Web developers can implement extensive validation logic to reduce the possibility of such errors, but Suite 9.0 offers a simpler solution for such issues. These are input masks that can be specified for various data formats using the following properties in the Grid column object:<\/p>\n<ul>\n<li><strong>numberMask<\/strong><\/li>\n<\/ul>\n<p>It is used to specify input masks for numeric values only. This property includes a range of parameters, provided on this page, that help you form the required number format. For instance, the input mask for the Salary column in the example below is configured the following way:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">...<br \/>\n<span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp;id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;salary&quot;<\/span><span class=\"sy0\">,<\/span> <br \/>\n&nbsp; &nbsp;header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Salary&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;numberMask<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> prefix<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;\u00a3&quot;<\/span><span class=\"sy0\">,<\/span> maxDecLength<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n...<\/div><\/div>\n<ul>\n<li><strong>patternMask<\/strong><\/li>\n<\/ul>\n<p>Using this property, you can specify an input mask for columns, where cells can contain number and string values. A common scenario is a mask for credit cards:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">...<br \/>\n<span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp;id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;card_number&quot;<\/span><span class=\"sy0\">,<\/span> <br \/>\n&nbsp; &nbsp;header<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#123;<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Card number&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;patternMask<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;0000 0000 0000 0000&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n...<\/div><\/div>\n<p>Use the sample below for testing various types of input masks in the data table built with the DHTMLX Grid widget:<br \/>\n<iframe data-src=\"https:\/\/snippet.dhtmlx.com\/45gjhciv?mode=mobile\" frameborder=\"0\" width=\"100%\" height=\"560\"class=\"snippet-container js-iframe\"><\/iframe> <a href=\"https:\/\/snippet.dhtmlx.com\/59d6hqtm?text=grid&#038;mode=wide rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<p>Find more details on configuring Grid input masks in the <a href=\"https:\/\/docs.dhtmlx.com\/suite\/grid\/configuration\/#formatting-columns\" rel=\"noopener\" target=\"_blank\">documentation<\/a>.<\/p>\n<p>These input mask novelties are now available in another data-centric Suite widget, Form. The API of this widget also received <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/form\/work_with_form\/#numbermask\" rel=\"noopener\" target=\"_blank\">numberMask<\/a><\/strong> and <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/form\/work_with_form\/#patternmask\" rel=\"noopener\" target=\"_blank\">patternMask<\/a><\/strong> properties for specifying required mask templates in <a href=\"https:\/\/docs.dhtmlx.com\/suite\/form\/input\/\" rel=\"noopener\" target=\"_blank\">Input<\/a> and <a href=\"https:\/\/docs.dhtmlx.com\/suite\/form\/textarea\/\" rel=\"noopener\" target=\"_blank\">Textarea<\/a> controls of the Form widget. The Input control API has the <strong><a href=\"https:\/\/docs.dhtmlx.com\/suite\/form\/api\/input\/input_gettext_method\/\" rel=\"noopener\" target=\"_blank\">getText()<\/a><\/strong> method for managing input masks. Try number masks and pattern masks for JS forms in action.<\/p>\n<p>The &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/suite\/whatsnew\/#version-90\" rel=\"noopener\" target=\"_blank\">What\u2019s new<\/a>&#8221; section will help you to get the complete info on all new features reviewed above and other minor novelties delivered in this major update.<\/p>\n<p>Check out the <a href=\"https:\/\/docs.dhtmlx.com\/suite\/migration\/#84---90\" rel=\"noopener\" target=\"_blank\">Migration page<\/a> to get acquainted with breaking changes associated with migrating from v8.4 to v9.0.<\/p>\n<p><strong>Note:<\/strong> If you have an active support subscription for the DHTMLX TreeGrid widget, you will get the updated DHTMLX Grid widget for free now.  We will provide bug fixes for DHTMLX TreeGrid upon request within a year.<\/p>\n<p>If you want to test all the exciting features in v9.0, download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSuite\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> of DHTMLX Suite and try things out. For our current clients, v9.0 is available in their <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client\u2019s Area<\/a>.<\/p>\n<h5>Related Materials<\/h5>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/suite\/whatsnew\/#version-90\" rel=\"noopener\" target=\"_blank\">What\u2019s new in v9.0<\/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\/dvqy4ewe?tag=grid&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">DHTMLX Suite code snippets<\/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>DHTMLX Grid has always been the ultimate driver of the Suite&#8217;s popularity among web developers. It enriched many business apps with numerous features required for effective presentation and manipulation &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":13166,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,6,10],"class_list":["post-13161","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-dhtmlxgrid","tag-dhtmlxsuite"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13161","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=13161"}],"version-history":[{"count":12,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13161\/revisions"}],"predecessor-version":[{"id":13181,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13161\/revisions\/13181"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/13166"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=13161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=13161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=13161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}