Universal Development Update – January 2019

  • 6 February 2019
  • 1 reply
Universal Development Update – January 2019
Userlevel 5
Badge +1
Hello everyone! Today we have the new monthly status update for the universal GUI.
Like always, a demo environment of Universal on the Insights application is accessible here using your Thinkwise credentials as login.

Alpha build

With this update we’ve also released an alpha build so you can test it out for yourself. To aid (external) developers, we’ve created documentation for deploying, running and troubleshooting Universal. Be sure to keep the following in mind:

  • Universal must be deployed on the same server as Indicium. Browser security prohibits us from deploying this otherwise. For now.
  • Universal only works with version 2018.3 of the Thinkwise Platform.
  • Furthermore, make sure you run all hotfixes on the IAM and SF that you plan to use for Universal.
  • Make sure you are on the latest version of Indicium.
  • This is an Alpha version, there is no compatibility plan in place for Universal just yet. Indicium updates and IAM hotfixes will eventually break this Alpha release.
Download your alpha build here


The breadcrumbs are finished! With the complete breadcrumb you always know where you are in the application.

We can divide the breadcrumb in three parts:

  • Active row indicates the current selected row.
  • Between the parentheses the current type of subject is shown.
  • The path summarizes the parents, how did you get to this screen.

Filtering on lookups

After sorting we now also support filtering on lookup translation values as we promised in the previous Universal post. It maybe seems like an obvious feature to an end user, but under the hood it may be quite sophisticated. It means we should order or filter the current data set based on data values from a related subject, possibly with some other related subjects in between: called lookup value resolvement.

From the end user’s point of view, this means (s)he gets the to see the expected filter results based on the values shown in the GUI, rather than their database values.

In our Insights application, the direct result of this feature is visible in e.g. “Employee->Hours”, filtered on an Activity like “boatmans”. The name of the Activity is selected from the Activity via another subject, as shown in the image below.

The name of the activity is fetched using an intermediate table.

Scroll to selected row after filtering

The Cardlist and Grid now scroll the selected row into the visible area of the screen after filtering. When the selected row is already visible, no scrolling will take place.

Scrolling to the selected row after filtering in the Grid.

Restoring vertical scroll position

When switching to another document and back, the vertical scroll position is now restored. This is implemented for the Cardlist, Grid and Form.

Restoring vertical scroll position in the Grid.

Background image

It's back from the past! We can apply the background image once again. For now we have one option available: we implemented this feature with a stretched background in mind. So smaller images won't look good because they will be stretched and become blurry, but other options are being considered as an setting in the SF.

Clear cache on errors

We've added the ability to clear the cache when a severe error occurs. So when something really bad happens you can keep using Universal with a clean slate without needing to do anything technical. It looks like this:


We noticed that the styling of Universal took an disproportional amount of time and resources to be applied in Universal. We figured out why this is and have made a design to remedy this. This will also make developing easier, but the most important part is that Universal will get a bit faster.

Editing and adding data
The moment we've all been waiting for. We're putting the finishing touches on the research and the plan to implement adding and editing data. This means that next month we can start work on building these features. Stay tuned for the next blog!

Lookup translation strategies
While implementing Breadcrumbs, we ran into a situation where a new kind of lookup translation strategy was requested. In this period we took our time to describe and design different strategies and their ideal application.

This resulted into two strategies:

#1: Translate an entire data set column at once with a single call to Indicium. We currently use this strategy.
  • 1 call to Indicium, who calls the database once
  • Returns duplicate results for the same value of data set rows
  • Result is shown afterwards at once
  • Translates invisible values
#2: (new) Select the translation of a single data value directly from the lookup subject.
  • Multiple smaller requests to Indicium and the database, possibly optimized by HTTP2
  • Caching prevents duplicate translation requests
  • Single result shown immediately
  • Translate values only from visible parts of the GUI, e.g. optimistic scrolling in Grid or Cardlist.
  • Currently possible, since the Universal now has knowledge about lookup value resolvement paths from the SF datamodel.
We need the second strategy right away for the new Breadcrumb component on a detail subject with an empty set. The breadcrumb shows the identity values of the parent subject to let the user know the path to the zoomed detail document. Possibly, these identity values should be translated into human readable values by using the lookup mechanism. In this case we have no data row to let Indicium know where to translate its values from. So right now these values are untranslated, and by implementing the second strategy they will also be translated.

Both strategies use the same caching mechanism, so each can use the data loaded and cached by the other one.

Lots of minor fixes / tasks

We keep putting an enormous amount of work in ensuring a high-quality product:
  • Designed zoom details in open documents
  • Designed scroll to active row
  • Fix deprecated AgGrid toolpanel properties
  • Fix console error on search
  • Added script to get test coverage
  • Fixed bug where conditional layout sometimes didn’t work
  • Fix grid values not updating when refreshing
  • Fix bug where browser refresh resulted in logout
  • Removed the React Router
  • Implemented compatibility with empty string as nulls in i_ui_views
  • Refactored away deprecated React lifecycle hooks
  • Fixed error when logging out immediately after a search
  • Fixed grid data jumping when loading multilines
  • Implemented domain alignment for grid cells and headers
  • Refactored away any types
  • No longer close open documents when switching applications
  • Use file API for meta images
  • Refactored sidebar
  • Implemented Look-up display value resolvement. For more details, visit the previous December blog.
  • Fixed grid line width
  • Fixed the margins around grid data

What we’ll be working on next month

  • Squashing another dozen or so bugs
  • Form add / edit
  • Adding paper to components to better separate them without splitter lines.
  • Global application breakpoint
  • Responsive filter
  • Responsive search
  • Responsive action bar
  • Improving the way we style components
  • Improving our build flow
  • Zoomed details in open documents
  • Form field alignment

1 reply

Userlevel 1
Badge +2

Images are missing in this blogpost.