Skip to main content
Sisense Community logo
  • Community Feedback
  • Chapters
  • Events
  • Forums
    • Help and How To
    • Product Feedback Forum
    • Strategy & Use Cases
  • Blogs
  • KB Docs
    • KB Docs
    • Add-Ons & Plug-Ins
    • APIs
    • Best Practices
    • Blox
    • CDT
    • Cloud Managed Service
    • Data Models
    • Data Sources
    • Embedding Analytics
    • How-Tos & FAQs
    • Onboarding
    • PySisense
    • Security
    • Sisense Administration
    • Sisense Intelligence & AI
    • Troubleshooting
    • Widget & Dashboard Scripts
  • Support
  • Learning
    • Sisense Academy: Free Courses and Certifications
    • Official Developer Documentation
    • Official Product Documentation
    • Official Sisense Youtube Channel
    • Sisense Compose SDK Playground
  • Use Case Gallery
All PostsDiscussionsBlogsIdeasQuestions
Leaderboards
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
  •                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
Discussions
  • TagsChevronRightIcon
dashboards & reporting
  • Question
    • Help and How-ToChevronRightIcon
                     
    Create flawless pixel perfect reports on PDF, PPT and XLS directly within Sisense using Report Studio
    Ido Darnell
    Ido Darnell
    Posted 2 months ago
    0
             
  • Idea
    • Product Feedback ForumChevronRightIcon
    Feature Request: Report Manager report management
             
    Valerie Munoz
    Valerie MunozPosted 4 months ago • Last reply 2 months ago
             
    1
             
  • Discussion
    Ido Darnell
    • Sisense Partners
             
    Ido Darnell
    Pixel-perfect design and reporting for Sisense, a review of available options
                                                                                                                                             

    If you manage Sisense, you've had some version of this conversation: someone asks for a report that actually looks like a finished document, not a dashboard screenshot with the edges cut off. There are more ways to solve this than most admins realize, and each one solves a different piece of the problem. A quick rundown: Native PDF export - zero setup, but the layout is whatever the dashboard happens to produce. No control over page breaks, no way to add narrative text, and pivot tables cut off at the edge of the screen. Sisense Report Manager - solid scheduling and delivery, but it's still exporting the dashboard as-is. No design layer, no multi-dashboard composition. Jasper Reports - genuinely pixel-perfect for table and pivot widgets specifically, if you have developer resource to build and maintain JRXML templates. Doesn't touch charts or KPI widgets. SAP Crystal Reports via ODBC - full design control, but it pulls your data out of Sisense entirely to do it, which is a real consideration if data residency matters to you. Where this leaves most teams: something that handles scheduling, or something that handles pixel-perfect tabular data, but not both, and rarely anything that lets you design a report as its own document rather than a dashboard export. That's the gap QBeeQ Report Studio is built for: a canvas inside Sisense where you design the report as a report - pulling from multiple dashboards if you need to, with full control over layout, brand, and every widget on the page. Report Studio Deliver , our scheduled distribution layer, is coming in beta this month. For the full breakdown with a side-by-side comparison table, here's the complete write-up .

    3 months ago
    0
             
  • Idea
    • Product Feedback ForumChevronRightIcon
    Allow Multiple Providers for Sisense Intelligence
                                             
    Fred Ortmann
    Fred OrtmannPosted 4 months ago • Last reply 3 months ago
             
    1
             
  • Blog banner
    • Widget & Dashboard ScriptsChevronRightIcon

    Setting Maximum Panel Items on Widget Panels via Scripting

                                                                                     

    Setting Maximum Items on Widget Panels via Script Sisense widgets set max panel item per type (values, rows, etc) limits that control how many dimensions, measures, and filters can be added to each panel. When these limits are reached, the Add Panel button is hidden, preventing users from adding additional fields. A widget script that sets the maxitems property on each panel is commonly used to raise (or occasionally lower) this limit. This very commonly used script may be experiencing issues on some new releases of Sisense (L2026.2.2-c). Dashboard designers and developers who have this script in place and are not experiencing any issues may leave the script unchanged. Dashboard designers who are experiencing problems can replace the script with the version shared below. For use cases that specifically use this script for pivot widgets and want it applied automatically across many widgets or configured per user group, the PivotMaxPanelItems plugin is a more scalable alternative. See Extending Pivot Widget Panel Limits in Sisense Using User Groups for details. Script That May Not Work The following script is commonly used as a widget script to raise the panel item limit: widget.manifest.data.panels.forEach(function(p) { p.metadata.maxitems = 40; // replace with the value needed }); This script accesses the panel metadata maxitems parameter directly through widget.manifest.data.panels . Based on current behavior, this path appears to be broken in some environments on specific Sisense versions.

    Without the script applied, if a panel type includes too many items, the Add Panel Button is hidden. Replacement Script The following script produces the same result and can be more reliable. widget.on('initialized', function() { widget.metadata.panels.forEach(function(p) { p.$$manifest.metadata.maxitems = 60; // replace with the value needed }); }); This version waits for the initialized event before accessing panel data, and references the panel's $$manifest.metadata path rather than going through widget.manifest.data . Dashboard designers and developers should update the maxitems value to match the limit needed for their use case. Note that setting a very high limit and adding a large number of fields to a widget may result in extended load times.
    With the script applied, the Add Panel Button does not disappear when below the new limit, and as many dimensions and fields as needed can be added to the widget. Applying This to More Complex Scripts and Plugins This potential fix applies to any plugin or script that sets maxitems on widget panels and uses this exact path. If a plugin or script accesses panel metadata through widget.manifest.data.panels and is functioning correctly, no changes are necessary. If it appears to no longer work, updating it to use widget.metadata.panels and reference p.$$manifest.metadata is likely to fix the issue. The scripts above are simply examples. More dynamic implementations, such as those that read current values, apply conditional logic, or use different values based on user type or user group, follow the same principle, if the older method is not working, replacing the maxitems path is a likely fix.

    Jeremy Friedel
    Jeremy FriedelPosted 3 months ago
    0
             
  • Blog banner
    • Add-ons & Plug-InsChevronRightIcon

    Remove Whiskers from Box and Whisker Widgets

                                             

    Download Link: removeWhiskersFromBoxWhiskerPlot.zip Overview This customization removes the whiskers from Box and Whisker Plot widgets by hiding both the horizontal whisker caps and the vertical whisker lines. This can help simplify the visualization when the focus is only on the quartile ranges and median values. The solution is available in two formats: A widget script version for applying the customization to individual widgets A plugin/add-on version for applying the customization to all Box and Whisker widgets globally across dashboards In addition to removing the whiskers, the script/plugin also: Renames the tooltip labels from "Min" and "Max" to user-defined labels such as "Lower Quartile" and "Upper Quartile" Reorders the tooltip values so the median appears between the quartiles instead of at the end This can be useful for: Simplifying Box and Whisker visualizations Aligning terminology with statistical or business standards Making quartile-based visualizations easier for business users to interpret Standardizing tooltip terminology across dashboards Implementation / Installation Instructions 1. Widget Script Version The script removes the whiskers from Box and Whisker widgets. whiskerWidth controls the horizontal line at the end of the whiskers lineWidth controls the vertical lines above and below the boxes Both attributes are set to 0 to completely remove the whiskers from view. The tooltip labels can also be customized by updating the first three variables in the script. Script // Define the new names for the boxes' "Min", "Max", and "Median" labels const newBoxMaxName = "Upper Quartile"; const newBoxMinName = "Lower Quartile"; const newMedianName = "Median"; // Remove whiskers and lines widget.on('processresult', function(se, ev) { // remove horizontal lines at the end of whiskers ev.result.series[0].whiskerWidth = "0"; // remove vertical lines above and below boxes ev.result.series[0].lineWidth = "0"; }); // Remove whiskers information from tooltip and rename boxes' "Min", "Max", and "Median" to user-defined labels widget.on("beforedatapointtooltip", function(w, args){ args.template = "<div class=\"boxplot-tooltip\"><div class=\"boxplot-tooltip-data\"><div class=\"boxplot-tooltip-value-name\"> " + newBoxMaxName + " </div><div class=\"boxplot-tooltip-value\" data-ng-style=\"{color: model.memberColor}\"> {{model.boxMax}} </div></div><div class=\"boxplot-tooltip-data\"><div class=\"boxplot-tooltip-value-name\"> " + newMedianName + " </div><div class=\"boxplot-tooltip-value\" data-ng-style=\"{color: model.memberColor}\"> {{model.boxMedian}} </div></div><div class=\"boxplot-tooltip-data\"><div class=\"boxplot-tooltip-value-name\"> " + newBoxMinName + " </div><div class=\"boxplot-tooltip-value\" data-ng-style=\"{color: model.memberColor}\"> {{model.boxMin}} </div></div><div class=\"highcharts-tooltip-line-separator\"></div></div><div class=\"boxplot-tooltip-category\"><div class=\"boxplot-tooltip-value-category\"> {{model.xAxis}} </div></div></div>"; }); Steps Copy the script above. Open the widget’s script editor from the widget menu. Paste the script into the editor. Modify the quartile/median labels if needed. Save the script. Refresh the widget. 2. Plugin / Add-on Version This version applies the customization globally instead of configuring each widget individually. Installation Steps Download and unzip the plugin zip file . Extract the files directly. Do not create an additional folder level; the plugin files are already organized correctly within the zip file. Upload the removeWhiskersFromBoxWhiskerPlot folder to the Sisense plugins directory ( /opt/sisense/storage/plugins ). This folder can be accessed from Admin tab -> App Configuration -> File Management -> plugins . Check the Add-ons page in the Admin tab under Server & Hardware and confirm the plugin is listed and enabled. To modify the quartile and median labels, open the config.js file inside the plugin folder and update the configuration values (see more details in the Configurations section below), then save the file. Wait approximately 30–60 seconds for the plugin service to restart. Configurations The following configuration values can be customized to control the labels displayed in the tooltip to any preferred naming convention. newBoxMaxName Controls the label displayed for the top edge of the box (labeled "Max" in the default tooltip). Example: "Upper Quartile" newBoxMinName Controls the label displayed for the bottom edge of the box (labeled "Min" in the default tooltip). Example: "Lower Quartile" newMedianName Controls the label displayed for the median value shown inside the box. Example: "Middle Quartile" Disclaimer This post outlines a potential custom workaround for a specific use case or provides instructions regarding a specific task. The solution may not work in all scenarios or Sisense versions, so we strongly recommend testing it in your environment before deployment. If you need further assistance with this, please let us know.

    Tri Anthony
    Tri AnthonyPosted 4 months ago
    0
             
  • Idea
    • Help and How-ToChevronRightIcon
    Are your end users losing filter context every time they switch dashboards?
                                                                                     
    Mia Isaacson
    Mia IsaacsonPosted 4 months ago
             
    0
             
  • Blog banner
    • Widget & Dashboard ScriptsChevronRightIcon

    Hiding Widgets if a Widget Has No Results [Linux]

                                                                                                             

    Hiding Widgets if a Widget Has No Results [Linux] Introduction A common dashboard design requirement is hiding widgets that have no data. This article includes a widget script that conditionally hides an indicator widget when its primary value is empty or represents an N/A like value. This behavior is commonly requested when dashboard filters or formulas result in no meaningful value and the widget should be visually hidden rather than showing an empty or zero indicator. The article also includes an alternative dashboard-level approach that hides widgets based on filter selections, without inspecting widget query results. This alternative is derived from the linked external blog post . This is applicable to both on-cloud and on-prem Sisense in all recent Sisense versions. Use Case Customers often want indicator widgets to disappear when their calculated value is not meaningful. Common examples include: Filters resulting in no matching data Calculations returning N/A, null, or empty values Conditional metrics that only apply to certain filter selections Rather than showing an empty indicator, this approach hides the widget entirely and restores it automatically when the value becomes valid again. Layout Considerations For best visual results, it is ideal to use one of these two layouts for the indicator widgets that may be hidden: Place the indicator widget in its own dashboard row Place it at the end of a row Hiding a widget via a script does not automatically resize or reflow other widgets on the same row. Step by Step Guide Widget Script to Hide Widget Based on Indicator Value This widget script is applied directly to the indicator widget. It evaluates the widget’s primary value after each render and hides or shows the widget accordingly. Behavior If the primary value is null, empty, or an N/A like string, the widget container is set to display: none. When the value becomes valid and not null again, the widget is restored to visibility and redrawn to ensure correct indicator rendering. A guard variable prevents infinite redraw loops, since a redraw triggers the widget ready event. A debug flag allows optional console logging when needed. Widget Script /** * Hide widget when its primary indicator value is empty or N/A-like. * * Behavior: * - If the value is empty, set the widget container to display "none". * - If the returned value becomes a number or valid value, restore display style to original and redraw * - A redraw triggers "ready" again, so a guard variable prevents a redraw loop. * * Debug: * - Set debug variable = true to enable console logging to track script status. * * For best results use on indicator in own row or at end of row, if other widgets exist on row, empty space will appear in dashboard */ widget.on("ready", function () { function run() { var debug; var suppressNextReady; var hideValues; debug = false; suppressNextReady = false; hideValues = [ "n/a", "#n/a", "na", "none", "null", "undefined" ]; // Function to turn console logging on or off function log(message, data) { if (!debug) { return; } if (data === undefined) { console.log("[hide-empty-indicator] " + message); return; } console.log("[hide-empty-indicator] " + message, data); } // Widget CSS selector function getWidgetElement() { return document.querySelector('widget[widgetid="' + widget.oid + '"]'); } // Get value of primary indicator value function getPrimaryValue() { if ( widget.queryResult && widget.queryResult.value && widget.queryResult.value.data !== undefined ) { return widget.queryResult.value.data; } try { if ( widget.queryResult && widget.queryResult.data && widget.queryResult.data.length ) { return widget.queryResult.data[0][0]; } } catch (e) { log("Value read failed for data[0][0].", e); } if (widget.queryResult && Array.isArray(widget.queryResult)) { if (widget.queryResult.length && widget.queryResult[0].length) { if (widget.queryResult[0][0]) { return widget.queryResult[0][0].Value; } } } return null; } function shouldHide(value) { var text; var normalized; if (value === null || value === undefined) { return true; } text = String(value).trim(); if (!text) { return true; } normalized = text.replace(/\\/g, "/").toLowerCase(); return hideValues.indexOf(normalized) !== -1; } function isElementHidden(element) { if (!element) { return false; } return element.style.display === "none"; } function hideWidget(element) { if (!element) { return; } if (element.style.display === "none") { return; } element.style.display = "none"; log("Hid widget due to empty/N/A-like value."); } function showWidgetAndRedrawIfNeeded(element) { var wasHidden; if (!element) { return; } wasHidden = isElementHidden(element); element.style.display = ""; if (!wasHidden) { log("Widget already visible."); return; } if (typeof widget.redraw !== "function") { log("Widget restored, redraw not available."); return; } suppressNextReady = true; log("Widget restored, triggering redraw."); widget.redraw(); } function applyRule() { var element; var primaryValue; element = getWidgetElement(); if (!element) { log("Widget container element not found."); return; } if (widget.queryResult === undefined) { log("queryResult is not available yet, keeping widget visible."); element.style.display = ""; return; } primaryValue = getPrimaryValue(); log("Primary value evaluated.", primaryValue); if (shouldHide(primaryValue)) { hideWidget(element); return; } showWidgetAndRedrawIfNeeded(element); } function onReady() { if (suppressNextReady) { suppressNextReady = false; log("Ready fired after redraw, applying rule without redraw."); applyRule(); return; } applyRule(); } onReady(); } run(); }); Notes The script uses display: none instead of jQuery hide or show to avoid layout and rendering issues with indicator widgets. Redraw is triggered only when restoring visibility, not when hiding. The script relies only on the widget ready event, which fires again after redraw and filter changes. Dashboard Script to Hide Widgets Based on Filter Selections As an alternative, widgets can be hidden purely based on filter selections, without checking whether the widget returns data. This approach is useful when visibility rules are deterministic based on filters. This method uses a dashboard script and CSS classes to hide widget containers. Example Dashboard Script dashboard.on('filterschanged', function (se, ev) { let filterName = 'Region' //mapping of filter items and widgets to be hidden. //if selected filter item is not available in the list, widgets in 'default' key will be hidden let itemWidgetMapping = { 'Midwest':['6390b5a285a029002e9e2ad6'], 'South': ['6238887ba77683002ea4425b'], 'West':['6390b5a285a029002e9e2ad6', '6238887ba77683002ea4425b'], 'default':[] } selectedFilter = ev.items.find(el=>el.jaql.title == filterName) let selectedItem = 'default' if(selectedFilter && selectedFilter.jaql.filter.members) selectedItem = selectedFilter.jaql.filter.members[0] //unhide all widgets first and then hide widgets based on selected filter $(`widget`).closest('.dashboard-layout-subcell-host').removeClass('dontshowme-parent') if(selectedItem in itemWidgetMapping){ for (const [key, value] of Object.entries(itemWidgetMapping)) { if(key == selectedItem){ itemWidgetMapping[key].forEach(function (item, index) { $(`widget[widgetid="${item}"]`).closest('.dashboard-layout-subcell-host').addClass('dontshowme-parent') }); } } } else{ itemWidgetMapping['default'].forEach(function (item, index) { $(`widget[widgetid="${item}"]`).closest('.dashboard-layout-subcell-host').addClass('dontshowme-parent') }); } }); Choosing the Right Approach Generally the widget script is best suited when: Visibility depends on whether data is returned The indicator value can be empty due to calculations or filters Generally the dashboard script is best suited when: Visibility depends only on filter selections Centralized control over multiple widgets is required These approaches are alternatives and should not be used simultaneously for the same widgets. Conclusion Hiding indicator widgets based on their returned value can potentially improve dashboard clarity and user experience. The widget script approach provides result aware behavior, while the dashboard script approach offers deterministic, filter based control. Both methods are powerful tools for customizing dashboard widget visibility. Two Full Row Indicator Widgets, both visible First Row Indicator Widget is now hidden, by script, due to no data Two Indicators in one row, both visible Second Indicator is now hidden by script, due to no data Disclaimer: This post outlines a potential custom workaround for a specific use case or provides instructions regarding a specific task. The solution may not work in all scenarios or Sisense versions, so we strongly recommend testing it in your environment before deployment. If you need further assistance with this, please let us know.

    Jeremy Friedel
    Jeremy FriedelPosted 4 months ago
    0
             
  • Idea
    • Product Feedback ForumChevronRightIcon
    Make Narrative more polished and professional
                     
    Chris Wallingford
    Chris WallingfordPosted 4 months ago
             
    0
             
  • Idea
    • Help and How-ToChevronRightIcon
    Your Sisense charts are clean, but are your tooltips telling the whole story?
                                                                                             
    Mia Isaacson
    Mia IsaacsonPosted 4 months ago
             
    0
             
…