{"id":45433,"date":"2026-06-29T22:19:33","date_gmt":"2026-06-29T20:19:33","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=45433"},"modified":"2026-06-29T22:19:35","modified_gmt":"2026-06-29T20:19:35","slug":"m-files-bd-putting-it-together-with-the-visual-designer","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/","title":{"rendered":"M-Files BD &#8211; Putting it together with the Visual Designer"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">After several posts of theory, it&#8217;s time to build something. In this post, I will walk you through a Visual Designer tutorial to create a complete Contracts dashboard on the M-Files Sample Vault. Therefore, no JSON editing is required at all. The Visual Designer is the primary authoring path for most administrators. Power users who prefer hand-editing JSON can write directly in the JSON editor (toggle to switch in the top bar), but this post focuses on the visual approach where you build dashboards by clicking and filling forms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I picked the <strong>Sample Vault<\/strong> because it is the one that gets shipped when you are installing M-Files in evaluation mode and it contains some sample data, as its name suggests&#8230; Please note that since it is a rather old vault, data inside was created somewhere between 2004 and 2012. Therefore, in this blog, I will go back in time (yes, I can!) and consider that &#8220;today&#8221; is actually the &#8220;01-Nov-2011&#8221; (<strong>2011-11-01<\/strong>). In a real vault, you would use the dateToken <strong>&#8220;@today&#8221;<\/strong> instead, but for this blog, to allow you to reproduce the steps below, I chose that specific date since it gives interesting data to visualize.<\/p>\n\n\n\n<h2 id=\"h-1-what-i-am-going-to-build\" class=\"wp-block-heading\">1. What I am going to build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The target dashboard has eight widgets:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Four KPI tiles in a row at the top: Active Contracts, Expired Contracts, Contract Expiry &lt; 180d, No expiry date.<\/li>\n\n\n\n<li>One donut: Contracts by agreement type.<\/li>\n\n\n\n<li>One gauge (date-mode): days until the earliest\/next contract expiry.<\/li>\n\n\n\n<li>One area: contract expiry per year and per agreement type.<\/li>\n\n\n\n<li>One table: all expired contracts (for review or sales purpose).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This layout fills the right pane with a clean &#8220;summary at the top, distribution in the middle, action items at the bottom&#8221; reading order.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e57b56&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e57b56\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"2011\" 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\/8.1-scaled.png\" alt=\"Visual Designer tutorial end result\" class=\"wp-image-45434\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png 2560w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-300x236.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-1024x804.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-768x603.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-1536x1206.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-2048x1609.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><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<h2 id=\"h-2-creating-a-new-dashboard\" class=\"wp-block-heading\">2. Creating a new dashboard<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The dashboard management is done on the M-Files Admin UI. To access it, open <strong>M-Files Admin<\/strong> -&gt; <strong>Configurations<\/strong> -&gt; <strong>Other Applications<\/strong> -&gt; <strong>dbi services Business Dashboard<\/strong> -&gt; <strong>Dashboard<\/strong> tab. Then click on the <strong><em>Add New<\/em><\/strong> button. The editor opens, by default in Visual mode with an empty canvas and the Dashboard Settings panel on the right:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e58309&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e58309\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2370\" height=\"1668\" 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\/8.2.png\" alt=\"Visual Designer default look&amp;feel\" class=\"wp-image-45435\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2.png 2370w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2-300x211.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2-1024x721.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2-768x541.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2-1536x1081.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.2-2048x1441.png 2048w\" sizes=\"auto, (max-width: 2370px) 100vw, 2370px\" \/><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<h2 id=\"h-3-dashboard-settings\" class=\"wp-block-heading\">3. Dashboard Settings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before adding widgets, let&#8217;s configure the dashboard-level fields in the right panel. The below assumes you never updated the default values. If you would like to update the defaults so all future dashboards have your own, you can do it in the <strong>Configuration<\/strong> tab.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Name<\/strong>: <strong><em>Contracts Snapshot (01-Nov-2011)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Description (optional)<\/strong>: <strong><em>Quick view of contracts: active, expiring, distribution.<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Auto-refresh enabled<\/strong>: <strong><em>No<\/em><\/strong> (leave off for now, you can flip it on later if needed).<\/li>\n\n\n\n<li><strong>User can toggle<\/strong>: <strong><em>Yes<\/em><\/strong> (users can enable the auto-refresh).<\/li>\n\n\n\n<li><strong>Export to PDF enabled<\/strong>: <strong><em>Yes<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Export to CSV enabled<\/strong>: <strong><em>Yes<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Drill-through enabled<\/strong>: <strong><em>Yes<\/em><\/strong> (this is what makes the chart elements clickable and it displays details about the matching objects).<\/li>\n\n\n\n<li>Leave the rest as default. There are enough query results to fetch all details, each user sees only the objects their M-Files ACL allows, etc.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e58a07&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e58a07\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2366\" height=\"1666\" 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\/8.3.png\" alt=\"Updating the dashboard parameters in the Visual Designer\" class=\"wp-image-45436\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3.png 2366w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3-300x211.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3-1024x721.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3-768x541.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3-1536x1082.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.3-2048x1442.png 2048w\" sizes=\"auto, (max-width: 2366px) 100vw, 2366px\" \/><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<h2 id=\"h-4-the-first-kpi-tile-active-contracts\" class=\"wp-block-heading\">4. The first KPI tile: Active Contracts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Widget<\/em><\/strong> button in the footer. A blank tile appears on the canvas and the right panel switches to the widget config.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, we set the widget basic details:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Active Contracts<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Description (optional)<\/strong>: leave empty.<\/li>\n\n\n\n<li><strong>Widget Type<\/strong>: <strong><em>KPI Number<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Col Span<\/strong>: <strong><em>3<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Row Span<\/strong>: <strong><em>1<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Then, we need to configure the source of the data we want to see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Object Type(s)<\/strong>: <strong><em>Document<\/em><\/strong> (dropdown shows the vault&#8217;s object types).<\/li>\n\n\n\n<li><strong>Class (optional)<\/strong>: <strong><em>Contract or Agreement<\/em><\/strong> (automatically populated after selecting an object type).<\/li>\n\n\n\n<li><strong>Aggregation Type<\/strong>: <strong><em>summary<\/em><\/strong> (already set automatically since it&#8217;s the only one supported by kpiNumber).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Optionally, we can configure one or more filters. Here, since we want to see only active contracts (i.e. that have an effective-through date superior or equal to today), then we need to apply a certain filter. Click on the <strong><em>+ Add Filter<\/em><\/strong> button and a row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Property<\/strong>: <strong><em>Effective through (date)<\/em><\/strong> (from the property dropdown, the &#8220;(date)&#8221; is the data-type that is shown but it&#8217;s not part of the property name).<\/li>\n\n\n\n<li><strong>Operator<\/strong>: <strong><em>greater than or equal (&gt;=)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value type<\/strong>: <strong><em>dateToken<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value<\/strong>: <strong><em>2011-11-01<\/em><\/strong> (instead of &#8220;@today&#8221; in a real vault).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, we define the aggregation (i.e. what to do with the results obtained) as well as the display section, which are optional graphical\/rendering details:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reducer<\/strong>: <strong><em>count<\/em><\/strong> (default).<\/li>\n\n\n\n<li><strong>Drill-through Columns (comma-sep)<\/strong>: <strong><em>Agreement type, Effective through<\/em><\/strong> (the additional columns to add to table lists or drill-through details tables).<\/li>\n\n\n\n<li><strong>Display Unit<\/strong>: <strong><em>contracts<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To validate that the configuration is correct, you can click on the <strong><em>Test Widget<\/em><\/strong> button in the footer. The Test Results panel expands on the right side, and shows a green <strong><em>OK<\/em><\/strong>, which confirms the definition is correct. So far, so good.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e594c7&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e594c7\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2368\" height=\"1664\" 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\/8.4.png\" alt=\"Testing a first widget in Visual Designer\" class=\"wp-image-45437\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4.png 2368w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4-300x211.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4-1024x720.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4-768x540.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4-1536x1079.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.4-2048x1439.png 2048w\" sizes=\"auto, (max-width: 2368px) 100vw, 2368px\" \/><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<h2 id=\"h-5-the-other-three-kpi-tiles\" class=\"wp-block-heading\">5. The other three KPI tiles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The next three KPIs follow the same pattern as the first one, with different filters.<\/p>\n\n\n\n<h3 id=\"h-5-1-expired-contracts\" class=\"wp-block-heading\">5.1. Expired Contracts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With the 1st widget selected, click on the <strong><em>Clone Widget<\/em><\/strong> button. A new tile appears next to the first one, with exactly the same content. Simply update these fields:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Expired Contracts<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Operator<\/strong> (Filter): <strong><em>less than (&lt;)<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Threshold<\/em><\/strong> button and a row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Value<\/strong> (Threshold): <strong><em>1<\/em><\/strong> (any value equal or above 1 will match).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>red<\/em><\/strong> or <strong><em>#e74c3c<\/em><\/strong> (color used if above value is reached).<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-5-2-expiring-in-next-180-days\" class=\"wp-block-heading\">5.2. Expiring in next 180 days<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>Clone Widget<\/em><\/strong> button again:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Contract Expiry &lt; 180d<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Operator<\/strong> (Filter): <strong><em>between (from,to)<\/em><\/strong><\/li>\n\n\n\n<li><strong>Value<\/strong> (Filter): <strong><em>2011-11-01, 2011-11-01+180d<\/em><\/strong> (instead of &#8220;@today, @today+180d&#8221; in a real vault).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>orange<\/em><\/strong> or <strong><em>#f39c12<\/em><\/strong> (update the existing threshold and keep the value as 1).<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-5-3-no-expiry-date\" class=\"wp-block-heading\">5.3. No expiry date<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>Clone Widget<\/em><\/strong> button again:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>No expiry date<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Operator<\/strong> (Filter): <strong><em>is empty (incl. absent)<\/em><\/strong> (no value field for this operator).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Threshold<\/em><\/strong> button and a second row appears (keep the other one with 1-orange):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Value<\/strong> (Threshold): <strong><em>0<\/em><\/strong> (any value equal or above 0 but below 1 (c.f. other threshold) will match. i.e. only valid if equal to 0).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>green<\/em><\/strong> or <strong><em>#27ae60<\/em><\/strong> (color used if above value is reached).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">At this point the canvas shows four KPI tiles. They each have <strong><em>colSpan: 3<\/em><\/strong>, so they sit nicely in a row of four totalling 12 (full width of the dashboard). You can click on <strong><em>Test Queries<\/em><\/strong> button (at the top) to validate that all four kpiNumber widgets are correct.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e59fe3&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e59fe3\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2368\" height=\"1668\" 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\/8.5.png\" alt=\"Testing the first row widgets in Visual Designer\" class=\"wp-image-45438\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5.png 2368w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5-300x211.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5-1024x721.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5-768x541.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5-1536x1082.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.5-2048x1443.png 2048w\" sizes=\"auto, (max-width: 2368px) 100vw, 2368px\" \/><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<h2 id=\"h-6-the-donut-contracts-by-agreement-type\" class=\"wp-block-heading\">6. The donut: contracts by agreement type<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Widget<\/em><\/strong> button in the footer to add a new widget:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>By Agreement Type<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Widget Type<\/strong>: <strong><em>Donut Chart<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Col Span<\/strong>: <strong><em>6<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Row Span<\/strong>: <strong><em>2<\/em><\/strong> (chart widgets need height, see Post 3).<\/li>\n\n\n\n<li><strong>Object Type(s)<\/strong>: <strong><em>Document<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Class (optional)<\/strong>: <strong><em>Contract or Agreement<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Aggregation Type<\/strong>: <strong><em>Group by Property<\/em><\/strong> (all objects with the same value of a specific property will be grouped together).<\/li>\n\n\n\n<li><strong>Group-by Property<\/strong>: <strong><em>Agreement type (lookup)<\/em><\/strong> (the property to be used for the grouping).<\/li>\n\n\n\n<li><strong>Drill-through Columns (comma-sep)<\/strong>: <strong><em>Agreement type, Effective through<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-7-the-date-mode-gauge-countdown-to-next-expiry\" class=\"wp-block-heading\">7. The date-mode gauge: countdown to next expiry<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The gauge is where things get more interesting. Here, I would like a dial showing how many days are left until the earliest\/next contract expiry. This can be useful for making sure you never reach &#8220;0&#8221; (i.e. the date of today) on some tasks, like contracts renewal, period reviews of some documents, etc. You can see this as something similar to a fuel gauge in a car. If it reaches the minimum, you might be in trouble&#8230; The reducer is <strong><em>min<\/em><\/strong> on the <strong><em>Effective through<\/em><\/strong> property, and since this property is a date, it triggers date-mode automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add the sixth widget. You know the drill, <strong><em>+ Add Widget<\/em><\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Closest Expiry<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Widget Type<\/strong>: <strong><em>Gauge<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Col Span<\/strong>: <strong><em>6<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Row Span<\/strong>: <strong><em>2<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Object Type(s)<\/strong>: <strong><em>Document<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Class (optional)<\/strong>: <strong><em>Contract or Agreement<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s add a filter to keep only valid contracts again: click on the <strong><em>+ Add Filter<\/em><\/strong> button and a row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Property<\/strong>: <strong><em>Effective through (date)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Operator<\/strong>: <strong><em>greater than or equal (&gt;=)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value type<\/strong>: <strong><em>dateToken<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value<\/strong>: <strong><em>2011-11-01<\/em><\/strong> (instead of &#8220;@today&#8221; in a real vault).<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reducer<\/strong>: <strong><em>min<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Reducer Property<\/strong>: <strong><em>Effective through (date)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Drill-through Columns (comma-sep)<\/strong>: <strong><em>Agreement type, Effective through<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Now let&#8217;s add a first threshold: click on the <strong><em>+ Add Threshold<\/em><\/strong> button and a row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Value<\/strong> (Threshold): <strong><em>0<\/em><\/strong> (so &#8220;today&#8221; = the contract expiry is very soon).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>red<\/em><\/strong> or <strong><em>#e74c3c<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Threshold<\/em><\/strong> button and a second row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Value<\/strong> (Threshold): <strong><em>40<\/em><\/strong> (so &#8220;next month&#8221; = the contract expiry is coming).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>orange<\/em><\/strong> or <strong><em>#f39c12<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Threshold<\/em><\/strong> button and a third row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Value<\/strong> (Threshold): <strong><em>80<\/em><\/strong> (so at least &#8220;2 months left&#8221; = the contract expiry is still far).<\/li>\n\n\n\n<li><strong>Color<\/strong> (Threshold): <strong><em>green<\/em><\/strong> or <strong><em>#27ae60<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Display Min (day offset)<\/strong>: <strong><em>0<\/em><\/strong> (so &#8220;today&#8221;).<\/li>\n\n\n\n<li><strong>Display Max (day offset)<\/strong>: <strong><em>180<\/em><\/strong> (so &#8220;today&#8221; + 180 days).<\/li>\n\n\n\n<li><strong>Display Unit<\/strong>: <strong><em>next expiry<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-7-1-sample-vault-date-limitation\" class=\"wp-block-heading\">7.1. Sample Vault date limitation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> This widget will not fully work on the Sample Vault as-is, since the data is from 2011 and all contracts are already in the past. In a real vault, you would use <strong><em>@today<\/em><\/strong> as the filter value and set min\/max to 0 and 180. The gauge would then show the number of days until the earliest active contract expires.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the Sample Vault, since 01-Nov-2011 is roughly 5350 days in the past, you would need to set min to &#8220;-5350&#8221; and max to &#8220;-5350+180&#8221; to see a meaningful result. The exact offset depends on when you read this, which is precisely why date tokens like <strong><em>@today<\/em><\/strong> exist &#8211; they adapt automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If I set the min\/max offset to the accurate number of days since 01-Nov-2011, the gauge looks like this for end-users (that&#8217;s what It will look like on a real vault with <strong><em>@today<\/em><\/strong> and 0-180 values):<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e5ae88&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e5ae88\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"492\" 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\/8.7.png\" alt=\"Gauge in date-mode\" class=\"wp-image-45439\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.7.png 844w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.7-300x175.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.7-768x448.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><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<h2 id=\"h-8-the-area-chart-expiry-per-year-and-per-agreement-type\" class=\"wp-block-heading\">8. The area chart: expiry per year and per agreement type<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Add the seventh widget. It didn&#8217;t change since earlier, it&#8217;s still <strong><em>+ Add Widget<\/em><\/strong>&#8230;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Expiry per Year and Agreement Type<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Widget Type<\/strong>: <strong><em>Area Chart<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Col Span<\/strong>: <strong><em>12<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Row Span<\/strong>: <strong><em>2<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Object Type(s)<\/strong>: <strong><em>Document<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Class (optional)<\/strong>: <strong><em>Contract or Agreement<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Aggregation Type<\/strong>: <strong><em>Group by Date Bucket<\/em><\/strong> (all objects with the same date bucket for a specific property will be grouped together).<\/li>\n\n\n\n<li><strong>Date Property<\/strong>: <strong><em>Effective through (date)<\/em><\/strong> (the property to be used for the grouping).<\/li>\n\n\n\n<li><strong>Bucket Size<\/strong>: <strong><em>year<\/em><\/strong> (the objects within the same year will be in the same group).<\/li>\n\n\n\n<li><strong>Series Property (optional)<\/strong>: <strong><em>Agreement type (lookup)<\/em><\/strong> (a second grouping level).<\/li>\n\n\n\n<li><strong>Drill-through Columns (comma-sep)<\/strong>: <strong><em>Agreement type, Effective through<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Smooth Lines<\/strong>: <strong><em>Yes<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> Instead of an <strong><em>Area Chart<\/em><\/strong>, you can use a <strong><em>Line Chart<\/em><\/strong> or <strong><em>Bar Chart<\/em><\/strong>, these three are usually interchangeable and can give the same amount of information visually.<\/p>\n\n\n\n<h2 id=\"h-9-the-table-expired-contracts-to-review\" class=\"wp-block-heading\">9. The table: expired contracts to review<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The last widget is a table showing the list of all expired contracts. This can be used for review or for some sales purpose, as previously mentioned. So let&#8217;s <strong><em>+ Add Widget<\/em><\/strong> one last time:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Widget Title<\/strong>: <strong><em>Expired Contracts to Review<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Widget Type<\/strong>: <strong><em>Table<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Col Span<\/strong>: <strong><em>12<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Row Span<\/strong>: <strong><em>2<\/em><\/strong> (you can set 3 as well, for bigger table\/lists).<\/li>\n\n\n\n<li><strong>Object Type(s)<\/strong>: <strong><em>Document<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Class (optional)<\/strong>: <strong><em>Contract or Agreement<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Aggregation Type<\/strong>: <strong><em>List (list of individual objects)<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Click on the <strong><em>+ Add Filter<\/em><\/strong> button and a row appears:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Property<\/strong>: <strong><em>Effective through (date)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Operator<\/strong>: <strong><em>less than (&lt;)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value type<\/strong>: <strong><em>dateToken<\/em><\/strong>.<\/li>\n\n\n\n<li><strong>Value<\/strong>: <strong><em>2011-11-01<\/em><\/strong> (instead of &#8220;@today&#8221; in a real vault).<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Display Properties (comma-sep)<\/strong>: <strong><em>Agreement type, Effective through, Owner<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-10-sanity-check-amp-saving\" class=\"wp-block-heading\">10. Sanity check &amp; Saving<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before saving, you can click on the <strong><em>Test Queries<\/em><\/strong> button from the toolbar to validate all widgets at once. The right-panel should list eight widgets, all green and without any warnings or errors. If something is wrong &#8211; a property name typo, an incompatible reducer \/ widget combination &#8211; this is where it would surface, with a clean message describing what to fix.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a42f54e5ba34&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a42f54e5ba34\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2370\" height=\"1668\" 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\/8.10a.png\" alt=\"Final result of the full dashboard and validation test successful\" class=\"wp-image-45440\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a.png 2370w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a-300x211.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a-1024x721.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a-768x541.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a-1536x1081.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10a-2048x1441.png 2048w\" sizes=\"auto, (max-width: 2370px) 100vw, 2370px\" \/><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\">If it&#8217;s all green, then click on the <strong><em>Save<\/em><\/strong> button in the toolbar. The editor should display a message at the bottom saying it validated everything and then closes (you need to be quick to see the message). The Admin UI Dashboard tab refreshes, and the Contracts Snapshot dashboard now appears in the list, with its number of widgets and its description.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, let&#8217;s see what it looks like from an end-user perspective after all that work! You can open the M-Files Web or Desktop (or do a refresh CTRL+F5 \/ CMD+R if it&#8217;s already loaded), open the right pane by clicking on the <strong>Dashboard<\/strong> tab, and pick <strong>Contracts Snapshot<\/strong> from the dropdown (it should be displayed automatically if it&#8217;s your first dashboard). Every chart element should be clickable (drill-through is enabled), and the PDF \/ CSV export buttons should also be present.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See the first screenshot at the beginning of this blog post to see the final result that you can expect if you followed along the steps so far. Still, since you made it this far, here is what it looks like as a PDF Export:<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10b.pdf\" type=\"application\/pdf\" style=\"width:100%;height:840px\" aria-label=\"Embed of Contracts Snapshot (01-Nov-2011).\"><\/object><a id=\"wp-block-file--media-76220328-afb2-4a60-86cd-f639a9c0350c\" href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10b.pdf\">Contracts Snapshot (01-Nov-2011)<\/a><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.10b.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-76220328-afb2-4a60-86cd-f639a9c0350c\">Download<\/a><\/div>\n\n\n\n<h2 id=\"h-11-closing-thoughts\" class=\"wp-block-heading\">11. Closing thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I initially created the <strong>Business Dashboard<\/strong> with the JSON editor only, but I always had in mind that I needed to add a Visual Designer at some point, because not everybody knows how (or wants) to write JSON. Also, writing JSON directly requires you to know what is required, optional, supported or not supported. Even if the <strong><em>Test Queries<\/em><\/strong> and <strong><em>Save<\/em><\/strong> buttons both execute multiple layers of validations, to ensure everything you enter is supported, it still sends you warning after warning, error after error if you do not really know what you are doing. Therefore, the Visual Designer is great for that purpose, because you just click-through the details and you are guided all the way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Visual \/ JSON toggle at the top of the editor lets you switch between authoring paths at any time, and your work is preserved in both directions. If you prefer hand-editing JSON or need to do bulk changes, the JSON mode is always available\u2014but most administrators find the Visual Designer sufficient for their day-to-day work.<\/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\">Quick access to previous blog posts of the series:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-introducing-the-business-dashboard-module\/\" id=\"44913\" target=\"_blank\" rel=\"noreferrer noopener\">Post 1<\/a><\/strong> &#8211; Introduction to the <strong>Business Dashboard<\/strong>.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-end-user-experience\/\" id=\"44932\" target=\"_blank\" rel=\"noreferrer noopener\">Post 2<\/a><\/strong> &#8211; The <strong>end-user experience<\/strong>: opening the panel, switching dashboards, drill-through, exports, favorites, sharing.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-anatomy-of-a-dashboard-definition\/\" id=\"44952\" target=\"_blank\" rel=\"noreferrer noopener\">Post 3<\/a><\/strong> &#8211; The anatomy of a <strong>dashboard definition<\/strong>: the JSON structure that drives everything.<\/li>\n\n\n\n<li><strong>Posts <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-scalar-widgets-kpinumber-and-gauge\/\" id=\"45018\" target=\"_blank\" rel=\"noreferrer noopener\">4a<\/a>, <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-trend-widgets-line-and-area\/\" id=\"45076\" target=\"_blank\" rel=\"noreferrer noopener\">4b<\/a>, <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/\" id=\"45109\" target=\"_blank\" rel=\"noreferrer noopener\">4c<\/a><\/strong> &#8211; The <strong>widget catalog<\/strong>, split by type family: scalar widgets (<strong><em>kpiNumber<\/em><\/strong>, <strong><em>gauge<\/em><\/strong>), trend widgets (<strong><em>line<\/em><\/strong>, <strong><em>area<\/em><\/strong>), and distribution \/ tabular widgets (<strong><em>donut<\/em><\/strong>, <strong><em>bar<\/em><\/strong>, <strong><em>table<\/em><\/strong>).<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-queries-objecttype-class-filters-date-tokens\/\" id=\"45175\" target=\"_blank\" rel=\"noreferrer noopener\">Post 5<\/a><\/strong> &#8211; Writing queries: <strong><em>objectType<\/em><\/strong>, <strong><em>class<\/em><\/strong>, <strong>filters<\/strong>, date tokens.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/\" id=\"45206\" target=\"_blank\" rel=\"noreferrer noopener\">Post 6<\/a><\/strong> &#8211; <strong>Aggregations<\/strong> and <strong>reducers<\/strong>.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-the-admin-part\/\" id=\"45312\" target=\"_blank\" rel=\"noreferrer noopener\">Post 7<\/a><\/strong> &#8211; The <strong>Admin tab<\/strong>: actions, Visual Designer \/ JSON editor, validation, import \/ export, access control.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>After several posts of theory, it&#8217;s time to build something. In this post, I will walk you through a Visual Designer tutorial to create a complete Contracts dashboard on the M-Files Sample Vault. Therefore, no JSON editing is required at all. The Visual Designer is the primary authoring path for most administrators. Power users who [&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":[4109,4094,4113,4096,4132,4105,3190,1951,4131],"type_dbi":[],"class_list":["post-45433","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management","tag-area","tag-business-dashboard","tag-donut","tag-gauge","tag-json-editor","tag-kpinumber","tag-m-files","tag-table","tag-visual-designer"],"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 - Putting it together with the Visual Designer - dbi Blog<\/title>\n<meta name=\"description\" content=\"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.\" \/>\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-putting-it-together-with-the-visual-designer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M-Files BD - Putting it together with the Visual Designer\" \/>\n<meta property=\"og:description\" content=\"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-29T20:19:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-29T20:19:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"2011\" \/>\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-putting-it-together-with-the-visual-designer\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/\"},\"author\":{\"name\":\"Morgan Patou\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"headline\":\"M-Files BD &#8211; Putting it together with the Visual Designer\",\"datePublished\":\"2026-06-29T20:19:33+00:00\",\"dateModified\":\"2026-06-29T20:19:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/\"},\"wordCount\":2422,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/8.1-scaled.png\",\"keywords\":[\"area\",\"Business Dashboard\",\"donut\",\"Gauge\",\"JSON Editor\",\"kpiNumber\",\"M-Files\",\"table\",\"Visual Designer\"],\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/\",\"name\":\"M-Files BD - Putting it together with the Visual Designer - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/8.1-scaled.png\",\"datePublished\":\"2026-06-29T20:19:33+00:00\",\"dateModified\":\"2026-06-29T20:19:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"description\":\"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/8.1-scaled.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/8.1-scaled.png\",\"width\":2560,\"height\":2011},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-putting-it-together-with-the-visual-designer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M-Files BD &#8211; Putting it together with the Visual Designer\"}]},{\"@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 - Putting it together with the Visual Designer - dbi Blog","description":"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.","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-putting-it-together-with-the-visual-designer\/","og_locale":"en_US","og_type":"article","og_title":"M-Files BD - Putting it together with the Visual Designer","og_description":"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.","og_url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/","og_site_name":"dbi Blog","article_published_time":"2026-06-29T20:19:33+00:00","article_modified_time":"2026-06-29T20:19:35+00:00","og_image":[{"width":2560,"height":2011,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.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-putting-it-together-with-the-visual-designer\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/"},"author":{"name":"Morgan Patou","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"headline":"M-Files BD &#8211; Putting it together with the Visual Designer","datePublished":"2026-06-29T20:19:33+00:00","dateModified":"2026-06-29T20:19:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/"},"wordCount":2422,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png","keywords":["area","Business Dashboard","donut","Gauge","JSON Editor","kpiNumber","M-Files","table","Visual Designer"],"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/","url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/","name":"M-Files BD - Putting it together with the Visual Designer - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png","datePublished":"2026-06-29T20:19:33+00:00","dateModified":"2026-06-29T20:19:35+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"description":"Step-by-step Visual Designer tutorial: how to build a Contracts dashboard on the M-Files Sample Vault using the Business Dashboard.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/8.1-scaled.png","width":2560,"height":2011},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-putting-it-together-with-the-visual-designer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"M-Files BD &#8211; Putting it together with the Visual Designer"}]},{"@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\/45433","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=45433"}],"version-history":[{"count":4,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45433\/revisions"}],"predecessor-version":[{"id":45446,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45433\/revisions\/45446"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=45433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=45433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=45433"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=45433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}