Adding additional dimensions to the Scatter Map widget tooltip
Adding additional dimensions to the Scatter Map widget tooltip Additional dimensions can be added to the hover tooltip of the Scatter Map widget type, beyond the default limit of three, to include more information from other dimensions about a location in a Scatter Map widget. This can be accomplished by using a combination of the widget's before query event to add additional dimension data for the hover tooltips and the before datapoint tooltip event to incorporate these dimensions into the tooltip. This method of modifying the query using the "beforequery" event can also be applied to all other widget types // Add extra parameters to be used in tooltips by modifying query widget.on('beforequery', function (se, ev) { // Initial number of widget metadata panels excluding filter panel widget.initialPanelSizeExcludingFilterPanel = ev.query.metadata.filter((panel) => { return panel.panel !== "scope" }).length; // Extra dimensions to show in tooltip, should return a single result, include as many as needed, just add to array // Jaql Objects can be copied from other widgets from the prism.activeWidget.metadata.panels via the browser console // Modify JAQL as needed, title of JAQL is used in tooltip and can be modified to any string widget.extraDimensionJAQL = [ { "jaql": { "table": "Category", "column": "Category ID", "dim": "[Category.Category ID]", "datatype": "numeric", "merged": true, "agg": "count", "title": "Unique Category ID" } }, { "jaql": { "table": "Country", "column": "Country ID", "dim": "[Country.Country ID]", "datatype": "numeric", "merged": true, "agg": "count", "title": "Unique Country ID" } }, ] // Add to default widget query the extra dimensions to be used in tooltips ev.query.metadata = ev.query.metadata.concat(widget.extraDimensionJAQL) }); // Add extra dimensions added with beforequery object to ScatterMap tooltip widget.on("beforedatapointtooltip", (event, params) => { // Convert query results to include only the additional dimensions, and formatted for tooltip template var onlyAdditionalDimensions = widget.queryResult.$$rows.map((withoutDefaultDimensionOnlyAdditional) => { // Remove the default dimensions, first part of row result array var withoutDefaultDimensionOnlyAdditional = withoutDefaultDimensionOnlyAdditional.slice(widget.initialPanelSizeExcludingFilterPanel) // Format for tooltip template, include title from JAQL var extraDimensionObj = withoutDefaultDimensionOnlyAdditional.map((extraDimensionValue, index) => { // Use extraDimensionJAQL for label in tooltip return { "text": extraDimensionValue.text, "title": widget.extraDimensionJAQL[index].jaql.title } }) return extraDimensionObj }); // Object to store extra dimensions params.context.marker.extraDimension = {}; // Use matching queryIndex for tooltip of additional dimensions params.context.marker.extraDimension.arr = onlyAdditionalDimensions[params.context.marker.queryIndex]; // Template for tooltip, modify as needed params.template = ` <div class='geo-text'>{{ model.marker.name }}</div> <div class='measure-holder' data-ng-if='model.measuresMetadata.sizeTitle'> <div class='measure-title slf-text-secondary'>{{ model.measuresMetadata.sizeTitle }}:</div> <div class='measure-value'>{{ model.marker.sizeObj.text }}</div> </div> <div class='measure-holder' data-ng-if='model.measuresMetadata.colorTitle'> <div class='measure-title slf-text-secondary'>{{ model.measuresMetadata.colorTitle }}:</div> <div class='measure-value'>{{ model.marker.colorObj.text }}</div> </div> <div class='measure-holder details-measure-holder' data-ng-if='model.measuresMetadata.detailsTitle'> <div class='measure-title slf-text-secondary'>{{ model.measuresMetadata.detailsTitle }}:</div> <div class='measure-value' data-ng-if="!model.marker.detailsObj.arr">{{ model.marker.detailsObj.text }}</div> <div class="details-wait" data-ng-if="model.marker.detailsObj.pendingDetails"></div> <div data-ng-if="model.marker.detailsObj.arr"> <div class="details-value" data-ng-repeat="a in model.marker.detailsObj.arr">{{a.text}}</div> <div class="details-counter" data-ng-if="model.marker.detailsObj.hasMore"> <div class="details-counter">...</div> <div class="details-counter"> {{'smap.ttip.firstres'|translate:(args={count:model.marker.detailsObj.arr.length})}}</div> </div> </div> </div> <div data-ng-if="model.marker.extraDimension.arr"> <div data-ng-if='model.measuresMetadata.colorTitle'> <div class='measure-holder' data-ng-repeat="a in model.marker.extraDimension.arr"> <div class='measure-title slf-text-secondary'>{{a.title}}:</div> <div class="measure-value extra-dimension-value">{{a.text}}</div> </div> </div> </div>`; }); The JAQL can be changed to any valid JAQL object, and the tooltip template can also be further modified.1KViews2likes1CommentHow to Visually Differentiate Active Filters from "Include All" [Linux]
This article addresses how to visually differentiate active filters from "Include All" filters in Sisense dashboards. Many users find it challenging to distinguish between active filters (filters with one or more values selected) and inactive ones that include all options. This guide provides a solution for making active filters more visually prominent, which is particularly beneficial when the dashboard supports multiple languages and thus cannot rely solely on text changes.314Views2likes0CommentsAuto zoom Area Map widget to a specific country on load (Linux)
Auto zoom Area Map widget to a specific country on load To test this solution, you must create a dashboard based on Sample ECommerce and an Area Map widget based on a Country column. Once it is done - please go to the widget editor, click three dots select Edit Script, then paste the following script there: As a result, we have our Area Map widget zoomed to Germany on the initial load: const countryName = 'Germany' widget.on('processresult', (scope, args)=>{ saveMapObj() }) widget.on('domready', (scope, args)=>{ zoomToCountry(L.geoJson(widget.queryResult.geoJson), window.currentMap, countryName); }) function zoomToCountry(geoData, map, countryName) { // Create a new empty GeoJSON object to store only the selected country's feature(s) geoData.eachLayer(function (layer) { if (layer.feature.properties.name === countryName) { map.fitBounds(layer.getBounds()); // Zoom to country bounds } }) } function saveMapObj() { let leafletHookStatus = $$get(prism, 'autoZoomAreaMap.leaflet.initHookAdded') if(!leafletHookStatus) { L.Map.addInitHook(function () { window.currentMap = this }) $$set(prism, 'autoZoomAreaMap.leaflet.initHookAdded', true); } } [ALT Text: A map of Europe with colored regions indicating specific areas. Central Europe is highlighted in teal, while other areas appear in gray. The United Kingdom is visible to the northwest. The date displayed at the top indicates June 10, 2025.] DO NOT CHANGE!!! 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.617Views1like0CommentsHide vertical lines on the Pivot widget (Linux)
Hide vertical lines on the Pivot widget To test this solution, you must create a dashboard based on any cube and create any Pivot widget. Once it is done - please go to the widget editor, click three dots select Edit Script, then paste the following script there: const howManyRowsToIgnore = 2; widget.on('ready', () => { const cells = element[0].querySelectorAll('.table-grid__cell'); let maxColIndex = 0; cells.forEach(cell => { const match = cell.className.match(/table-grid__cell--col-(\d+)/); if (match) { const colIndex = parseInt(match[1], 10); if (colIndex > maxColIndex) { maxColIndex = colIndex; } } }); cells.forEach(cell => { const colMatch = cell.className.match(/table-grid__cell--col-(\d+)/); const rowMatch = cell.className.match(/table-grid__cell--row-(\d+)/); if (colMatch && rowMatch) { const colIndex = parseInt(colMatch[1], 10); const rowIndex = parseInt(rowMatch[1], 10); if (rowIndex >= howManyRowsToIgnore) { if (colIndex !== 0) { cell.style.borderLeft = 'none'; } if (colIndex !== maxColIndex) { cell.style.borderRight = 'none'; } } } }); }); Please note there is a howManyRowsToIgnore parameter that specifies how many first rows to ignore. It is done to have the possibility to leave vertical lines for header values if needed. If you need to hide all vertical lines including header-related lines as well - just set this value to 0. As a result, we have a Pivot widget with hidden vertical lines: [ALT Text: A table titled "Budget" displaying a list of brands along with their corresponding total costs. The first entry, "ABC," shows a total cost of $3,564,045.86. The subsequent entries include brands such as "Addimax," "Adderax," and "Addulator Inc," along with their respective total costs, ranging from around $100 to several million. The table spans multiple rows and includes a total of 2094 entries. The header indicates columns for "Brand" and "Total Cost."] 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.317Views1like0CommentsHow to Implement Linkable Text in a Widget (Linux)
How to Implement Linkable Text in a Widget (Linux) Introduction This article provides a guide on implementing linkable text to navigate to another dashboard in Sisense. The goal is to enable users to access a linked dashboard by clicking on a text element rather than interacting with a widget. This serves as a workaround for the default functionality, which typically requires a widget click (using Jump to Dashboard with native widgets). Step-by-Step Guide Using Text Widget: Use the direct link to the desired dashboard. This method allows users to be redirected directly to the dashboard upon clicking the text link. For example, you can add a hyperlink to the Text Widget. Prefer refer to this guide: Text Widget Documentation. Using BloX: Utilize the BloX widget to create a button that simulates the appearance and position of text within your design using the Action Button feature. This approach enables users to open the dashboard by clicking the button. Please follow this guide for reference: Creating Action Buttons. If you need to apply filters, configure the BloX widget to perform the Jump to Dashboard (JTD) action. For further instructions on setting up BloX with JTD, refer to this community article on using Jump to Dashboard in a BloX widget. Conclusion Implementing linkable text in a widget provides a seamless navigation experience in Sisense, bypassing the need for widget interactions. Whether using a Text Widget for direct links or leveraging BloX for more customization, these methods allow users to efficiently jump between dashboards. References/ Related Content How to Use Jump to Dashboard in a BloX Widget Creating Action Buttons Text Widget Documentation Jump to Dashboard515Views2likes0CommentsHow to record a .har file and identify if specific requests are present in logs
To record a .har file in Chrome, open Developer Tools > Network tab, enable recording, clear logs, and reproduce the issue before exporting the file. To check for jaql requests, filter by "jaql" in the Network tab and inspect the request status and X-Request-ID. For on-premise Sisense, use cat /var/log/sisense/sisense/<log_file_name> | grep <X-Request-ID> (single-node) or kubectl exec (multi-node) to search logs for the request.1.6KViews1like0CommentsHow to check specific pods CPU/memory consumption in Grafana
To check pod CPU and memory usage in Grafana, go to Dashboards > All Pods per Namespace, select sisense, adjust the time frame, and filter by pod name. Ensure CPU and memory graphs are visible in screenshots, taking separate ones for different pod types.1.6KViews2likes0CommentsMigrating Assets Across Environments Leveraging GIT
Migrating Assets Across Environments Leveraging GIT Sisense released its Git Integration for Linux version 2022.10. With the GIT GUI in Sisense, you can do a lot of exciting things like version control or integrate into CI/CD pipelines. I went ahead and put together a quick demo on how a developer can leverage the Sisense Git Integration to migrate assets from their Dev Environment to the Prod Environment and see those changes reflected in the target application that assets are embedded in. In this video we cover, 1. How to create a Git project in Sisense 2. Add Assets to a project 3. Connect to a remote Git Repo. 4. Push Assets from Dev to a remote Github Repo. 5. Pull Assets from Git Repo into the prod server. 6. Checkout and Commit changes/revert. 7. See Changes reflected in the application Sisense is embedded into. For any additional questions about Enabling Git in your environment, or other capabilities, please see the Introduction to Sisense Git Documentation. Check out this related content: Academy Documentation491Views0likes0CommentsAn overview of Sisense Linux microservices and what they do
An overview of Sisense Linux microservices and what they do This article provides an advanced description of Sisense’s Microservices and how they work internally. This is mainly for Administrators responsible for supporting Sisense in their organization. When we deploy Sisense on the Linux platform Sisense application deploys multiple pods this article helps us understand how they are tied to each Sisense functionality and how they internally operate. See Sisense Basic Concepts and Terminology and Sisense Architecture for a high-level overview. [PLEASE OPEN ATTACHMENT TO VIEW REMAINDER OF THIS ARTICLE]7.8KViews5likes0CommentsConverting an Existing Sisense Widget to a Dynamic ComposeSDK Widget Component
Using either the widget Sisense API's, or the Sisense widget JS API object, it is possible to determine all components and parameters of a widget required to create an equivalent dynamic ComposeSDK widget component. This approach allows the extraction of all components and parameters of a widget, enabling the creation of an equivalent dynamic ComposeSDK widget component without directly referencing or relying on a specific widget or dashboard ID. The metadata of an existing widget contains all the information needed to create a dynamic version of an existing Sisense widget. It is also possible to use an existing widget ID and dashboard ID to render an existing widget in ComposeSDK, but this does not take full advantage of the capabilities of ComposeSDK to generate new widgets directly.2.3KViews2likes0Comments