-
Notifications
You must be signed in to change notification settings - Fork 85
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7622f05
commit 55def71
Showing
10 changed files
with
68 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
55def71
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dashboard Filters and InteractionGroup
This commit and the previous ones merge the first milestone in a series of improvements that I want to do to Dashboards after taking a look at this Power BI video: https://www.youtube.com/watch?v=AGrl-H87pRU&t=3352s
Power BI has one important similarity with Signum Chartings and Dashboards: both put a lot of emphasis in creating a good model, relationships, expressions, and then making the dashboard is the last, simplest step.
Of course, Power BI works over multiple types of data sources and places very few restrictions on the schema (a very important feature if you want to sell a product). On the other side the Dashboard designer has more work since it has to first clean up the data and define the data model and relationships. A task that is typically not necessary if you are using Signum Charting / Dashboards over an already created Signum application because is necessary for the DB schema, UI, Search Control, Word reports, Email Templates, etc...
Anyway, one thing I liked a lot about Power BI is how all the widgets in the Dashboard are able to play with each other: When you click on one element of a chart it automatically filters the other widgets by the selected value.
This makes dashboard much more interactive and facilitates data exploration without needing to add non-visual components like EntityLines/EntityCombo/DateTime pickers for combos.
GIF Demo
What are we seeing:
BubblePack
is filtering all the other charts by this customer.BubblePlot
Producst share, we select a product to filter.BubblePlot
to remove the filter (this doesn't work onTreeMap
because the is no empty place, so use 4. instead).StackedArea
we can click in one particular number (not shown) but we can click on the horizontal axis to filter by month, or in the legend to filter by employee.All the chart types have been upgraded, except for the maps (SVG or Google maps).
Not shown in this Gif Demo: Once you are filtering by some value in one widgets, you can further refine the filter by clicking in another value in another widget.
The
CalendarStream
has been updated, now shows the month names and days of the week.How to activate it:
All this new functionality overrides the default behavior when clicking on a chart (opening a
SearchModal
with the values), so after some consideration we decided to make it opt-in.All the Dashboard Parts have now a nullable
InteractionGroup
property:By default the value is null, so:
Click => Opens
SearchModal
Ctrl + Click => Opens
SearchPage
in another tab.But if you choose an
InteractionGroup
then:Click => Sets the selected value as filter for the other parts in the same
InteractionGroup
Ctrl + Click => Adds/Removes another value as filter for the other parts in the same
InteractionGroup
Alt + Click => Opens
SearchModal
Ctrl + Alt + Click =>Opens
SearchPage
in another tab.Future Improvements
I have thee ideas that could complement this feature:
Dashboard filters
Now that all the widgets can send/receive filters to each other through the Dashboard, could make sense to allow global filters on the top of the dashboard using traditional pinned filters.
Alternatively, or complementary, add the ability to set default Dashboard Filters: For example when a user navigates to a dashboard, it looks like he has already clicked in his own Employee, but he could clear the filter or add another filter.
Not sure which of this two features could be more usefull.
QueryToken equivalences between different queries
Right now a widgets can only interact with another widgets if they use the same
queryName
. Maybe is useful have another widgets... likeOperationLog
by Employee and somewhere express in the Dashboard that:query:
Order
, token:Employee
== query:OperationLog
, token:User.Employee
But not sure if the feature will be understandable / useful enough.
Cached Queries (OLAP cubes)
Since currently each widget is doing direct SQL queries to the database, once many users start clicking in an interactive dashboard the performance problems could get worst.
What most BI products do is to work on some cached date that is refreshed on a regular basis. This cached data can contain only fine-grained aggregates that are combined together in the client computer to produce the desired chart. See OLAP cube.
The Dashboard could be configured to be cached (globally? or per part?) and analyze the different widgets to determine which key columns and aggregates would be needed.
Then, on a regular basis (with an Scheduled Task) save the results of this query to a JSON file (in Azure Blob storage for example). The web client will then automatically download this file make the queries client side, by combining the OLAP cubes.
I like this solution because will scale very well (only requires download from blob storage and client-side CPU processing) and can still be very integrated with the rest of the application, reusing Entity translations/format/unit as usual. Also will be easy to jump back to real-time SQL queries whenever is needed, like opening a
SearchModal
. Or give a permission to allow see real-time data to some roles.But this also has some limitations:
InteractionGroup
filtering by different keys, the file could get quite big. The serialized result could be just aResultTable
json file, of slightly more optimized to remove redundancy on repeated keys.TypeConditions
.Anyway, I think there are use cases where this feature could be very useful: Global interactive dashboards without pinned filters and maybe restricted to a few roles.
Conclusion
I have implemented the first important step to make dashboards cooler,
🙏 Any feedback is welcome to see if future development in any of this three ideas (or any other) is worth.
55def71
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
55def71
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Awesome, very good job
55def71
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
55def71
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great job! Fantastic feature 👏👏