{"id":45109,"date":"2026-06-16T19:55:41","date_gmt":"2026-06-16T17:55:41","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=45109"},"modified":"2026-06-16T22:55:51","modified_gmt":"2026-06-16T20:55:51","slug":"m-files-bd-distribution-and-tabular-widgets-donut-bar-table","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/","title":{"rendered":"M-Files BD &#8211; Distribution and tabular widgets: donut, bar, table"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This is the third and final widget post of the series. The previous two covered scalar widgets (<a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-scalar-widgets-kpinumber-and-gauge\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 4a<\/a>) and trend widgets (<a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-trend-widgets-line-and-area\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 4b<\/a>). What is left is the <strong>distribution and tabular<\/strong> widgets: <strong><em>donut<\/em><\/strong>, <strong><em>bar<\/em><\/strong>, and <strong><em>table<\/em><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The grouping is loose but useful: <strong><em>donut<\/em><\/strong> and <strong><em>bar<\/em><\/strong> answer questions like &#8220;how does my population break down into categories?&#8221;, while <strong><em>table<\/em><\/strong> can answer pretty much any question&#8230; Together, they cover the rest of the use cases, where you want either a visual distribution or the actual details of what is in the vault.<\/p>\n\n\n\n<h2 id=\"h-1-donut-distribution-across-categories\" class=\"wp-block-heading\">1. donut &#8211; distribution across categories<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong><em>donut<\/em><\/strong> chart shows how a population splits across the distinct values of a property. Labels and values appear on the slices, while the legend is placed next to the donut when the pane is wide enough (otherwise below it). The engine computes a layout that estimates the legend width from the longest label, then centers the donut in the remaining space, with the ring filling the main part of the available area.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n  &quot;id&quot;: &quot;&quot;,\n  &quot;title&quot;: &quot;Contracts by Agreement Type&quot;,\n  &quot;type&quot;: &quot;donut&quot;,\n  &quot;gridColumnSpan&quot;: 6,\n  &quot;gridRowSpan&quot;: 2,\n  &quot;query&quot;: {\n    &quot;objectType&quot;: &quot;Document&quot;,\n    &quot;class&quot;: &quot;Contract or Agreement&quot;,\n    &quot;aggregation&quot;: {\n      &quot;type&quot;: &quot;groupByProperty&quot;,\n      &quot;propertyName&quot;: &quot;Agreement type&quot;,\n      &quot;resolveValueListLabels&quot;: &quot;Yes&quot;,\n      &quot;includeEmptyResults&quot;: &quot;No&quot;\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37745889&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37745889\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"836\" height=\"472\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png\" alt=\"Distribution and tabular widget - Donut\" class=\"wp-image-45138\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png 836w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1-300x169.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1-768x434.png 768w\" sizes=\"auto, (max-width: 836px) 100vw, 836px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 id=\"h-1-1-aggregations-the-donut-accepts\" class=\"wp-block-heading\">1.1. Aggregations the donut accepts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Two aggregation types work with <strong><em>donut<\/em><\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>groupByProperty<\/em><\/strong>: group by the values of that specific property, often the natural choice for category distributions.<\/li>\n\n\n\n<li><strong><em>groupByDateBucket<\/em><\/strong>: group by dates based on a certain bucket size. The date buckets will be ordered chronologically, where usually donut slices would be ordered by decreasing counts of objects.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-1-2-resolvevaluelistlabels\" class=\"wp-block-heading\">1.2. resolveValueListLabels<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For properties backed by an M-Files value list, <strong><em>resolveValueListLabels: &#8220;Yes&#8221;<\/em><\/strong> (the default) shows the human display names on the slices&#8217; tooltip and in the legend. On the other hand, <strong><em>&#8220;No&#8221;<\/em><\/strong> shows the internal IDs. The default is correct for almost every dashboard, <strong><em>&#8220;No&#8221;<\/em><\/strong> might be useful for technical investigations.<\/p>\n\n\n\n<h3 id=\"h-1-3-seriesproperty-the-multi-mini-pie-grid\" class=\"wp-block-heading\">1.3. seriesProperty: the multi-mini-pie grid<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most distinctive feature of the donut widget. When you set a <strong><em>seriesProperty<\/em><\/strong>, the widget switches to a <strong>multi-mini-pie grid<\/strong>: one donut per distinct value of the series property, all sharing a single legend. Each small donut shows the distribution of the primary <strong><em>propertyName<\/em><\/strong> within that series slice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n  &quot;id&quot;: &quot;&quot;,\n  &quot;title&quot;: &quot;Contracts by Agreement Type x Year&quot;,\n  &quot;type&quot;: &quot;donut&quot;,\n  &quot;gridColumnSpan&quot;: 12,\n  &quot;gridRowSpan&quot;: 4,\n  &quot;query&quot;: {\n    &quot;objectType&quot;: &quot;Document&quot;,\n    &quot;class&quot;: &quot;Contract or Agreement&quot;,\n    &quot;aggregation&quot;: {\n      &quot;type&quot;: &quot;groupByDateBucket&quot;,\n      &quot;propertyName&quot;: &quot;Effective through&quot;,\n      &quot;bucketSize&quot;: &quot;year&quot;,\n      &quot;seriesProperty&quot;: &quot;Agreement type&quot;,\n      &quot;includeEmptyResults&quot;: &quot;No&quot;\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">This produces, for example, one donut per Agreement type, with each donut showing the distribution by year for their Effective through property. As you can see below, it takes more space, since multiple donuts will be displayed. Depending on what you want to see, you could also simply display multiple donut widgets with the associated filters, instead of a single widget with a multi-series. That is, if you know how many series you need (and therefore how many widgets you need with their dedicated filters) and if it&#8217;s not a dynamic number.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c377461e2&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c377461e2\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1246\" height=\"926\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.3-1.png\" alt=\"M-Files distribution chart - multi-series donuts\" class=\"wp-image-45140\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.3-1.png 1246w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.3-1-300x223.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.3-1-1024x761.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.3-1-768x571.png 768w\" sizes=\"auto, (max-width: 1246px) 100vw, 1246px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A few practical notes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The donuts are all <strong>resize-aware<\/strong>: when the right pane is resized, the engine recomputes the size of all donuts. The number of donuts per row is fixed and defined at first rendering, based on the size that the widget has available (based on its configuration) and the number of series that were found.<\/li>\n\n\n\n<li>A series where every visible slice is zero is shown as a <strong>grey ring<\/strong>, so the user does not have to wonder whether the chart loaded. This is the same for single-series donuts too.<\/li>\n\n\n\n<li>Like every <strong><em>seriesProperty<\/em><\/strong>, this should be a <strong>low-cardinality<\/strong> property. A grid of six donuts is most probably fine, but a grid of fifty might be difficult to display properly, unless if you have a very big screen!<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-1-4-the-tooltip-touch\" class=\"wp-block-heading\">1.4. The tooltip touch<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As all other tooltips, the one on the Donut will show the numbers that match the query with a thousand separator (e.g. <strong><em>1&#8217;520<\/em><\/strong> or <strong><em>1,520<\/em><\/strong> (depending on your regional settings) rather than <strong><em>1520<\/em><\/strong>). But in addition, it will also include the percentage that this slice represents. It is a small detail, but it usually helps and avoids the need to calculate that yourself.<\/p>\n\n\n\n<h2 id=\"h-2-bar-vertical-and-horizontal-bar-charts\" class=\"wp-block-heading\">2. bar &#8211; vertical and horizontal bar charts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong><em>bar<\/em><\/strong> widget covers a large surface and deserves its own deep dive. It supports both vertical and horizontal orientations, both single-series and multi-series modes, and per-bar threshold coloring in single-series too. Most of the configuration lives in two <strong><em>display<\/em><\/strong> keys: <strong><em>barLayout<\/em><\/strong> and <strong><em>thresholds<\/em><\/strong>.<\/p>\n\n\n\n<h3 id=\"h-2-1-a-first-vertical-bar\" class=\"wp-block-heading\">2.1. A first vertical bar<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Taking the same example as for the previous blog post on the Invoices\/Revenue:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n  &quot;id&quot;: &quot;&quot;,\n  &quot;title&quot;: &quot;Monthly revenue&quot;,\n  &quot;type&quot;: &quot;bar&quot;,\n  &quot;gridColumnSpan&quot;: 12,\n  &quot;gridRowSpan&quot;: 2,\n  &quot;query&quot;: {\n    &quot;objectType&quot;: &quot;Document&quot;,\n    &quot;class&quot;: &quot;Invoice&quot;,\n    &quot;filters&quot;: &#x5B;\n      { &quot;property&quot;: &quot;Invoice date&quot;, &quot;operator&quot;: &quot;between&quot;,\n        &quot;value&quot;: &#x5B;&quot;@startOfYear&quot;, &quot;@endOfYear&quot;], &quot;valueType&quot;: &quot;dateToken&quot; }\n    ],\n    &quot;aggregation&quot;: {\n      &quot;type&quot;: &quot;groupByDateBucket&quot;,\n      &quot;propertyName&quot;: &quot;Invoice date&quot;,\n      &quot;bucketSize&quot;: &quot;month&quot;,\n      &quot;reducer&quot;: &quot;sum&quot;,\n      &quot;reducerProperty&quot;: &quot;Amount&quot;,\n      &quot;includeEmptyResults&quot;: &quot;Yes&quot;\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The X-axis labels rotate at <strong><em>-15 degrees<\/em><\/strong> always (not conditionally), so they never overlap the bars or the chart area below them. This was a small thing needed to avoid strange display when the space for the widget is very small or when there are long labels to be displayed. As you can see below, it is very similar to the line\/area widgets in its essence:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37746bcb&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37746bcb\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1658\" height=\"472\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1.png\" alt=\"Distribution and tabular widget - table\" class=\"wp-image-45112\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1.png 1658w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1-300x85.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1-1024x292.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1-768x219.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.1-1536x437.png 1536w\" sizes=\"auto, (max-width: 1658px) 100vw, 1658px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 id=\"h-2-2-display-thresholds-in-single-series-mode\" class=\"wp-block-heading\">2.2. display.thresholds in single-series mode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In single-series mode, <strong><em>display.thresholds<\/em><\/strong> colors <strong>each bar individually<\/strong> based on its own value. You can either use text values representing colors or the HTML color code:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&quot;display&quot;: {\n  &quot;thresholds&quot;: &#x5B;\n    { &quot;value&quot;: 0, &quot;color&quot;: &quot;red&quot; },\n    { &quot;value&quot;: 40000, &quot;color&quot;: &quot;orange&quot; },\n    { &quot;value&quot;: 100000, &quot;color&quot;: &quot;yellow&quot; },\n    { &quot;value&quot;: 120000, &quot;color&quot;: &quot;green&quot; }\n  ]\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">So bars with value 0 to 40&#8217;000 will be displayed in red (when value is 0, there is no bar, so only the tooltip will show a red &#8220;0&#8221;). Bars with 40&#8217;000 to 100&#8217;000 will become orange, etc.:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37747288&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37747288\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1658\" height=\"472\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2.png\" alt=\"M-Files distribution chart - table with threshold colors\" class=\"wp-image-45113\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2.png 1658w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2-300x85.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2-1024x292.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2-768x219.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.2-1536x437.png 1536w\" sizes=\"auto, (max-width: 1658px) 100vw, 1658px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As with <strong><em>line<\/em><\/strong> \/ <strong><em>area<\/em><\/strong>, thresholds are <strong>ignored in multi-series mode<\/strong> (each series uses the automatic palette so the legend color stays consistent).<\/p>\n\n\n\n<h3 id=\"h-2-3-display-barlayout\" class=\"wp-block-heading\">2.3. display.barLayout<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bar charts have two orthogonal choices: orientation (vertical vs horizontal) and multi-series mode (stacked vs grouped). The <strong><em>display.barLayout<\/em><\/strong> key combines them into a single value:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Value<\/th><th>Orientation<\/th><th>Multi-series mode<\/th><\/tr><\/thead><tbody><tr><td><strong><em>&#8220;vertical-stacked&#8221;<\/em><\/strong> <em>(default)<\/em><\/td><td>Vertical<\/td><td>Stacked segments<\/td><\/tr><tr><td><strong><em>&#8220;vertical-grouped&#8221;<\/em><\/strong><\/td><td>Vertical<\/td><td>Side-by-side bars per category<\/td><\/tr><tr><td><strong><em>&#8220;horizontal-stacked&#8221;<\/em><\/strong><\/td><td>Horizontal<\/td><td>Stacked segments<\/td><\/tr><tr><td><strong><em>&#8220;horizontal-grouped&#8221;<\/em><\/strong><\/td><td>Horizontal<\/td><td>Side-by-side bars per category<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For <strong>single-series<\/strong> bars (i.e. when no <strong><em>seriesProperty<\/em><\/strong> is used), only orientation matters. The stacked \/ grouped distinction has no visible effect, since there is a single value anyway). So a single-series chart with <strong><em>vertical-stacked<\/em><\/strong> and one with <strong><em>vertical-grouped<\/em><\/strong> render identically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Horizontal charts place categories on the Y axis (top to bottom in the same order they would appear left to right on a vertical chart) and values on the X axis. This is useful when category labels are long enough that the -15 degree rotation still does not fit or when you want more space to display the values rather than the different categories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See the screenshot on the following section for the distinction between the vertical\/horizontal and stacked\/grouped.<\/p>\n\n\n\n<h3 id=\"h-2-4-seriesproperty-stacked-or-grouped\" class=\"wp-block-heading\">2.4. seriesProperty: stacked or grouped<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByDateBucket&quot;,\n  &quot;propertyName&quot;: &quot;Invoice date&quot;,\n  &quot;bucketSize&quot;: &quot;month&quot;,\n  &quot;reducer&quot;: &quot;sum&quot;,\n  &quot;reducerProperty&quot;: &quot;Amount&quot;,\n  &quot;seriesProperty&quot;: &quot;Country&quot;,\n  &quot;includeEmptyResults&quot;: &quot;Yes&quot;\n}\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">With <strong><em>seriesProperty: &#8220;Country&#8221;<\/em><\/strong> and <strong><em>display.barLayout: &#8220;vertical-stacked&#8221;<\/em><\/strong>, you get a stacked bar chart where each month bar is split into each values found for the &#8220;Country&#8221; property (here: Switzerland &amp; USA). With <strong><em>vertical-grouped<\/em><\/strong>, you get two side-by-side bars per month (one for each &#8220;Country&#8221; value). The chart tells the same story with two (or rather four) different displays. Note: for the below screenshot, I reduced the filtering to only the first 6 months of the year, to be able to do a side-by-side comparison of how these charts look. The goal isn&#8217;t to see the full year here, only to show you how these different display options render:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37748670&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37748670\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1658\" height=\"934\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4.png\" alt=\"M-Files distribution chart - bar with multi-series\" class=\"wp-image-45114\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4.png 1658w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4-300x169.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4-1024x577.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4-768x433.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.2.4-1536x865.png 1536w\" sizes=\"auto, (max-width: 1658px) 100vw, 1658px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 id=\"h-2-5-aggregations-the-bar-widget-accepts\" class=\"wp-block-heading\">2.5. Aggregations the bar widget accepts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The bar widget accepts <strong><em>groupByProperty<\/em><\/strong> and <strong><em>groupByDateBucket<\/em><\/strong>, same as the donut and trend widgets, and the date-valued reducer rule from posts 4a and 4b applies here too: a reducer that returns a date string cannot be plotted on a numeric axis, so the widget will show a placeholder.<\/p>\n\n\n\n<h2 id=\"h-3-table-sortable-paginated-multipurpose\" class=\"wp-block-heading\">3. table &#8211; sortable, paginated, multipurpose<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong><em>table<\/em><\/strong> widget is the last, and most flexible of the catalog. It accepts <strong>all four aggregation types<\/strong> (<strong><em>summary<\/em><\/strong>, <strong><em>groupByProperty<\/em><\/strong>, <strong><em>groupByDateBucket<\/em><\/strong>, <strong><em>list<\/em><\/strong>), and it is the <strong>only<\/strong> widget that supports <strong><em>list<\/em><\/strong>. This makes it the natural fallback when other widget types cannot display a specific combination, and the obvious choice when the user wants to see the raw objects (without the drill-through).<\/p>\n\n\n\n<h3 id=\"h-3-1-a-list-aggregation-table\" class=\"wp-block-heading\">3.1. A list-aggregation table<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the &#8220;give me the details&#8221; case. The aggregation is <strong><em>list<\/em><\/strong> and with the <strong><em>displayProperties<\/em><\/strong> parameter, it is possible to control which columns are shown alongside the object name.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n{\n  &quot;id&quot;: &quot;&quot;,\n  &quot;title&quot;: &quot;All Projects&quot;,\n  &quot;type&quot;: &quot;table&quot;,\n  &quot;gridColumnSpan&quot;: 12,\n  &quot;gridRowSpan&quot;: 4,\n  &quot;query&quot;: {\n    &quot;objectType&quot;: &quot;Project&quot;,\n    &quot;aggregation&quot;: {\n      &quot;type&quot;: &quot;list&quot;,\n      &quot;displayProperties&quot;: &#x5B;&quot;Class&quot;, &quot;In progress&quot;, &quot;Customer&quot;, &quot;Project Manager&quot;]\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The result is a sortable table with one row per <strong><em>Project<\/em><\/strong>, and five columns (object name, Class, In progress, Customer and Project Manager). Above, there was no Class enforced, so all classes from M-Files will apply. That&#8217;s why in the screenshot, you can see both <strong><em>Internal Project<\/em><\/strong> and <strong><em>Customer Project<\/em><\/strong> objects, which are the two classes in question. Only the <strong><em>Customer Project<\/em><\/strong> has a <strong><em>Customer<\/em><\/strong> property, but it isn&#8217;t a problem, it is simply displayed as <strong><em>&#8220;-&#8220;<\/em><\/strong> for the <strong><em>Internal Project<\/em><\/strong> objects. Clicking a row name navigates the user directly to the object in M-Files, no drill-through modal is opening, since the row already represents one object.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37748f47&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37748f47\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2044\" height=\"934\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1.png\" alt=\"Distribution and tabular widget - table\" class=\"wp-image-45115\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1.png 2044w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1-300x137.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1-1024x468.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1-768x351.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.1-1536x702.png 1536w\" sizes=\"auto, (max-width: 2044px) 100vw, 2044px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 id=\"h-3-2-sorting-and-pagination\" class=\"wp-block-heading\">3.2. Sorting and pagination<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every column header is clickable to sort ascending or descending. In above screenshot, the second column is sorted in descending order. The sort applies across <strong>all fetched rows<\/strong>, not just the currently visible page, which (I believe) is the behavior users would expect when sorting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Note:<\/em><\/strong> This is NOT how M-Files behaves in its own search! In M-Files, by default, when you search for something and you get more than 1 page of results, if you sort a column, only what is displayed on the screen gets sorted&#8230; Which is a problem from my point of view, since it sorts only partial data and you might see things you don&#8217;t expect. Therefore, M-Files is doing a page-by-page sorting and not a global sorting. On the other hand, the <strong><em>Business Dashboard<\/em><\/strong> will sort correctly and apply the sorting on ALL data, and not just the current page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pagination kicks in at 15 rows per page, by default (configurable), and the pagination bar at the bottom shows the current range and the total fetched.<\/p>\n\n\n\n<h3 id=\"h-3-3-display-details\" class=\"wp-block-heading\">3.3. Display details<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Numeric columns honor <strong><em>display.decimals<\/em><\/strong> and both numeric and dates honors regional settings as well. In above example, you can see the 4th row with a <strong><em>Customer<\/em><\/strong> column that shows a value <strong><em>&#8220;Tennessee Land Surveyors (Nashville) || Lance Smith Engineering (Surveying)&#8221;<\/em><\/strong>. This is actually a concatenation of two customers. This project, in the M-Files Sample Vault, is assigned to two different customers, and therefore, it is shown in the table (or any drill-through modal) as a concatenation of <strong><em>Customer1 || Customer2<\/em><\/strong>. No data is silently cut or hidden, everything that is actually part of the metadata model is shown as it should. That&#8217;s how multi-select lookup values are displayed.<\/p>\n\n\n\n<h3 id=\"h-3-4-seriesproperty-the-cross-tab-pivot\" class=\"wp-block-heading\">3.4. seriesProperty: the cross-tab pivot<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As other widgets, the table supports multi-series (via the same <strong><em>seriesProperty<\/em><\/strong>) when it is using a <strong><em>groupByProperty<\/em><\/strong> or <strong><em>groupByDateBucket<\/em><\/strong> aggregation. In this case, it becomes a <strong>cross-tab pivot<\/strong>. This means that rows will remain the groups for the primary group property, while additional columns will be added for each group of the series property. Therefore, both rows (primary group) and columns (series group) are fully dynamic. Here are two table widgets definitions, the first one without multi-series and the second one with it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByProperty&quot;,\n  &quot;propertyName&quot;: &quot;Project manager&quot;,\n  &quot;displayProperties&quot;: &#x5B;&quot;Class&quot;, &quot;In progress&quot;, &quot;Customer&quot;, &quot;Project Manager&quot;]\n}\n...\n...\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByProperty&quot;,\n  &quot;propertyName&quot;: &quot;Project manager&quot;,\n  &quot;seriesProperty&quot;: &quot;Class&quot;,\n  &quot;displayProperties&quot;: &#x5B;&quot;Class&quot;, &quot;In progress&quot;, &quot;Customer&quot;, &quot;Project Manager&quot;]\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">With the above, you get the count of <strong><em>Projects<\/em><\/strong> that each <strong><em>Project Manager<\/em><\/strong> handles for the first one. While the second widget, adds another dimension that is the <strong><em>&#8220;Class&#8221;<\/em><\/strong> of the objects, i.e. whether the <strong><em>Projects<\/em><\/strong> that the managers handle is an <strong><em>Internal Project<\/em><\/strong> or a <strong><em>Customer Project<\/em><\/strong>. The result of these two widgets is the following:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a31c37749855&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a31c37749855\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1658\" height=\"934\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4.png\" alt=\"M-Files distribution chart - table with multi-series\" class=\"wp-image-45116\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4.png 1658w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4-300x169.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4-1024x577.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4-768x433.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.3.4-1536x865.png 1536w\" sizes=\"auto, (max-width: 1658px) 100vw, 1658px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this multi-series case, all series columns include a link on their count. Therefore, each number is clickable, and it will display the drill-through that matches this series AND this primary group. E.g. which <strong><em>Customer Projects<\/em><\/strong> are handled by <strong><em>Tommy Hart<\/em><\/strong>.<\/p>\n\n\n\n<h3 id=\"h-3-5-drill-through-on-tables\" class=\"wp-block-heading\">3.5. Drill-through on tables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Table drill-through behavior depends on the aggregation type, which is documented in detail in <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-end-user-experience\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 2<\/a> (the end-user post) but worth recapping here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For <strong><em>summary<\/em><\/strong>, <strong><em>groupByProperty<\/em><\/strong>, <strong><em>groupByDateBucket<\/em><\/strong>: clicking a row (or a specific column from a row in case of multi-series as mentioned above) opens the drill-through modal showing the underlying objects.<\/li>\n\n\n\n<li>For <strong><em>list<\/em><\/strong>: clicking a row name navigates directly to the object. No modal, because the row already represents one object.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-3-6-the-safe-fallback-role\" class=\"wp-block-heading\">3.6. The &#8220;safe fallback&#8221; role<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I mentioned earlier that <strong><em>table<\/em><\/strong> accepts every aggregation type. This makes it the safe choice for cases where other widgets refuse. The most common one is <strong>date-valued reducers<\/strong>: if the answer to your question is a date per group (e.g. &#8220;latest invoice date per customer&#8221;), the chart widgets cannot plot that, but the <strong><em>table<\/em><\/strong> widget will happily render it with one row per customer and a date value for each row.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whenever the validation flags a date-valued reducer warning on a chart widget, switching the widget type to <strong><em>kpiNumber<\/em><\/strong> or <strong><em>gauge<\/em><\/strong> might be the right answer if you need only one date. Otherwise, switching to <strong><em>table<\/em><\/strong> is the only remaining and valid option.<\/p>\n\n\n\n<h2 id=\"h-4-the-compatibility-cheat-sheet\" class=\"wp-block-heading\">4. The compatibility cheat sheet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To close the widget posts, here is the full compatibility matrix the validator enforces, as of now. You can use that as a quick reference when authoring:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Widget type<\/th><th class=\"has-text-align-center\" data-align=\"center\">summary<\/th><th class=\"has-text-align-center\" data-align=\"center\">groupByProperty<\/th><th class=\"has-text-align-center\" data-align=\"center\">groupByDateBucket<\/th><th class=\"has-text-align-center\" data-align=\"center\">list<\/th><th class=\"has-text-align-center\" data-align=\"center\">seriesProperty<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>kpiNumber<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">ignored<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>gauge<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">ignored<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>donut<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">multi-mini-pie<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>bar<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">stacked or grouped<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>line<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">multi-series lines<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>area<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">&#8211;<\/td><td class=\"has-text-align-center\" data-align=\"center\">multi-series areas<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong><em>table<\/em><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">yes<\/td><td class=\"has-text-align-center\" data-align=\"center\">cross-tab pivot<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When the validation reports an incompatible combination, the message usually includes the right alternative (typically &#8220;use <strong><em>kpiNumber<\/em><\/strong>, <strong><em>gauge<\/em><\/strong> or <strong><em>table<\/em><\/strong>&#8221; for date-valued reducers, or &#8220;use <strong><em>table<\/em><\/strong> for list aggregations&#8221;).<\/p>\n\n\n\n<h2 id=\"h-5-closing-thoughts\" class=\"wp-block-heading\">5. Closing thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">That closes the widget catalog. The seven widget types cover the full range of business questions I typically see: scalar answers (<strong><em>kpiNumber<\/em><\/strong>, <strong><em>gauge<\/em><\/strong>), trends (<strong><em>line<\/em><\/strong>, <strong><em>area<\/em><\/strong>), distributions (<strong><em>donut<\/em><\/strong>, <strong><em>bar<\/em><\/strong>), and raw enumerations or whatever else (<strong><em>table<\/em><\/strong>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two observations from real customer dashboards:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Most useful dashboards mix widget types.<\/strong> A row of KPIs at the top, a couple of distribution charts in the middle, a list table at the bottom. The mental model the user builds reading top to bottom is &#8220;summary, distribution, details&#8221;.<\/li>\n\n\n\n<li><strong>Most pitfalls live at the boundary between aggregation and widget type.<\/strong> If a widget shows a placeholder, the explanation is almost always &#8220;this aggregation produces a shape this widget cannot render&#8221;. The validation spells it out before save, so trust it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Post 5 shifts from &#8220;what widgets exist&#8221; to &#8220;how to write the query that feeds them&#8221;: object types, classes, filter operators, and date tokens. After that, Post 6 covers aggregations and reducers in detail. With those two, every JSON block in the widget posts will make complete sense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Want to know more about this Business Dashboard? <a href=\"https:\/\/www.dbi-services.com\/company\/contact\/\" target=\"_blank\" rel=\"noreferrer noopener\">Contact us<\/a> and we will be happy to showcase it on <a href=\"https:\/\/www.m-files.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">M-Files<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the third and final widget post of the series. The previous two covered scalar widgets (Post 4a) and trend widgets (Post 4b). What is left is the distribution and tabular widgets: donut, bar, and table. The grouping is loose but useful: donut and bar answer questions like &#8220;how does my population break down [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[525],"tags":[4114,4094,4113,3190,1951,4099],"type_dbi":[],"class_list":["post-45109","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management","tag-bar","tag-business-dashboard","tag-donut","tag-m-files","tag-table","tag-widget"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>M-Files BD - Distribution and tabular widgets: donut, bar, table - dbi Blog<\/title>\n<meta name=\"description\" content=\"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M-Files BD - Distribution and tabular widgets: donut, bar, table\" \/>\n<meta property=\"og:description\" content=\"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-16T17:55:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-16T20:55:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"836\" \/>\n\t<meta property=\"og:image:height\" content=\"472\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Morgan Patou\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MorganPatou\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Morgan Patou\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/\"},\"author\":{\"name\":\"Morgan Patou\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"headline\":\"M-Files BD &#8211; Distribution and tabular widgets: donut, bar, table\",\"datePublished\":\"2026-06-16T17:55:41+00:00\",\"dateModified\":\"2026-06-16T20:55:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/\"},\"wordCount\":2362,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/4c.1.0-1.png\",\"keywords\":[\"bar\",\"Business Dashboard\",\"donut\",\"M-Files\",\"table\",\"widget\"],\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/\",\"name\":\"M-Files BD - Distribution and tabular widgets: donut, bar, table - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/4c.1.0-1.png\",\"datePublished\":\"2026-06-16T17:55:41+00:00\",\"dateModified\":\"2026-06-16T20:55:51+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"description\":\"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/4c.1.0-1.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/4c.1.0-1.png\",\"width\":836,\"height\":472},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M-Files BD &#8211; Distribution and tabular widgets: donut, bar, table\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\",\"name\":\"Morgan Patou\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"caption\":\"Morgan Patou\"},\"description\":\"Morgan Patou has over 15 years of experience in Digitalization &amp; Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache HTTPD\\\/Tomcat, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\\\/Banking, and the Pharmaceutical industry.\",\"sameAs\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/morgan-patou\\\/\",\"https:\\\/\\\/x.com\\\/MorganPatou\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/morgan-patou\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"M-Files BD - Distribution and tabular widgets: donut, bar, table - dbi Blog","description":"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/","og_locale":"en_US","og_type":"article","og_title":"M-Files BD - Distribution and tabular widgets: donut, bar, table","og_description":"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.","og_url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/","og_site_name":"dbi Blog","article_published_time":"2026-06-16T17:55:41+00:00","article_modified_time":"2026-06-16T20:55:51+00:00","og_image":[{"width":836,"height":472,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png","type":"image\/png"}],"author":"Morgan Patou","twitter_card":"summary_large_image","twitter_creator":"@MorganPatou","twitter_misc":{"Written by":"Morgan Patou","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/"},"author":{"name":"Morgan Patou","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"headline":"M-Files BD &#8211; Distribution and tabular widgets: donut, bar, table","datePublished":"2026-06-16T17:55:41+00:00","dateModified":"2026-06-16T20:55:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/"},"wordCount":2362,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png","keywords":["bar","Business Dashboard","donut","M-Files","table","widget"],"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/","url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/","name":"M-Files BD - Distribution and tabular widgets: donut, bar, table - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png","datePublished":"2026-06-16T17:55:41+00:00","dateModified":"2026-06-16T20:55:51+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"description":"Donut, bar and table widgets in the M-Files Business Dashboard: category distributions, stacked bars, sortable tables and cross-tab pivots.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/4c.1.0-1.png","width":836,"height":472},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"M-Files BD &#8211; Distribution and tabular widgets: donut, bar, table"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8","name":"Morgan Patou","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","caption":"Morgan Patou"},"description":"Morgan Patou has over 15 years of experience in Digitalization &amp; Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache HTTPD\/Tomcat, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\/Banking, and the Pharmaceutical industry.","sameAs":["https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/","https:\/\/x.com\/MorganPatou"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=45109"}],"version-history":[{"count":3,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45109\/revisions"}],"predecessor-version":[{"id":45141,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45109\/revisions\/45141"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=45109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=45109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=45109"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=45109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}