Retool apps can come in all shapes and sizes (and all of them are beautiful). Nevertheless, the vast majority of internal apps revolve around some sort of CRUD interface, and in these apps, layout is everything. Imagine building the World’s Greatest, Most Ultra-Efficient house, paying to kit it out with all the best tech and gadgets, only to put a coffee table in the bathroom and the couch in the garden. That’s what it means to get lazy with your internal dashboards and back offices, which might sometimes seem like the unsightly ‘utility room’ of the whole operation, but what really are some of the most crucial components that help your business grow.
To help you avoid these interior design issues and get you set off on the right foot, we will walk you through some different possible CRUD layouts in Retool, what they are good and not-so-good for, and give you some of our best tips and tricks for layout best (and worst) practices.
Quick Links:
Disclaimer: Each Retool app is unique to its users and functions, so while we aim to provide a simple overview with some best practices and UI guidance, these won’t suit all use cases, and there are many exceptions to each rule!
Let’s start with some general best practices.
At the risk of sounding like my mother, don’t leave empty components lying around the place! Tidy up! If components (such as tables) remain empty unless something is selected or activated, hide or disable them - it’s bad UI to leave anything empty, as to the end-user it can look broken or confusing (unless the emphasis is on the lack of records). The best practice is to set components to ‘hidden’ when empty.
When thinking about editable elements, remember that anything that is permanently editable is a risk - if it’s easy to accidentally edit something, it’s hard to use an app properly. Think about adding an edit modal instead, which is automatically populated with the current values as default, to separate the edit action from generally viewing the data. Avoid making tables editable if you can (it’s hard to follow their edits and too easy to make a mistake).
Aim for a single-page layout and try to keep as much as you can above the fold (i.e. no need to scroll down to see info) - this makes it easier for users to navigate and see all elements easily. Most importantly - try and avoid horizontal scrolls in tables, it’s too easy to get lost in the data.
The beauty of Retool is the ability to easily integrate many processes into a single app. If you have different apps that are reliant upon each other, things can get messy and change the way users interact with the tool - Retool also lacks a way of showing breadcrumbs well in applications, so it can be tricky to track back. To combat this, consider combining simple functions into a single app through modals, separate container tabs, hidden components, and unique container views.
The header section (as opposed to the body) of your Retool environment is a neat little space that adjusts dynamically in size, so is a great place for any show/hide elements, such as extra overview analytics or even an advanced filter container. Its position can also be fixed, so you can utilize this space to use filters down the page, display aggregate statistics, or as a navbar.
Now, let's take a look at some of the classic Retool UIs:
Wizard workflows are great for completing complex multistep processes to create or update records, and where they really excel - where others don’t - is cascading logic.
Wizards are separated into multiple steps that require a user to click onto the next page. This works particularly well for processes that change depending on certain inputs, as the wizard can send a user in several directions to continue the form, depending on, for example, their selection in a dropdown component.
fulfil
Something we see a little too often is developers integrating these cascading workflows into a tabbed container, which is far less intuitive and creates a whole host of problems for the user. Wizards are perfectly designed to fulfil this need, and should typically be used in place of tabs for multi-step processes.
There are many ways to integrate the wizard. You could have a wizard on its own, or you could put a wizard in a side panel or action modal.
✨Good For✨
👎🏻Not-so-good For👎🏻
A single, full-width table with a custom column for actions is great for applications that have a limited number of columns, as it allows an emphasis on comparing records vertically, in a tabular format. This layout is particularly useful if you need to perform simple actions in a modal, such as editing a single row at a time, or viewing chart data specific to that single object that pops out (and doesn't need to be compared to other rows). You can use the event handlers of your custom button to trigger a modal to open for this.
In general, since we are using the entire screen real estate for the table, the types of queries performed in each row must be limited to a couple of simple buttons. This solution might not be best if any of your column headers or its values are particularly long: table headers and cells don’t wrap naturally in Retool and will require the user to hover over ellipses to see that attribute's value, or you’ll need to add in additional CSS to make the values wrap - not so great for UI.
✨Good For ✨
👎🏻Not-so-Good For 👎🏻
This layout is an absolute classic and tends to be one of the most common layouts in Retool. The table next to a container is great for workflows that include comparing a limited number of columns in tabular format, but with the main emphasis being on showing the entire record.
Having a side container allows for the use of additional Retool components to show and interact with your data. Take the example GIF above: on the bottom of the first tab, you can see that we use a timeline to show additional attributes of our record, where inside of a table, nested information like this might not make that much sense. By using a side panel we can also use the right components for the data we are presenting.
The side container is also great for drilling into your data. Perhaps a record includes time series data, with a side panel you can drill into the record and display the time series in a nice and neat chart. Since we switched our container to be a tabbed container, we can space out a large record even further, providing tidy categorization for additional statistics or separate types of data with which that record is associated.
If you are looking to quickly compare 4+ columns in a table, this format might not be the one for you, as there is less horizontal screen space available for your table to accurately display all those columns.
✨Good For✨
👎🏻Not-so-Good For👎🏻
Top tips:
be
Depending on different actions that you take within your data, you may want to see different ‘views’ of tables, charts etc. You can use tabs to create dashboards with different primary focuses, such as ‘Overview’, ‘Detailed View’ ‘Financial View’, to name an example. These can work really well for apps that are used by different teams with different priorities, or for apps that perform different focuses using the same data.
This doesn’t work, however, if these views are dependent on each other, or if there is a multi-step action to take across them.
✨Good For✨
👎🏻Not-so-good For👎🏻
Top Tips:
In general, it’s important to try to compartmentalize processes and actions in your application somewhat, to make it more intuitive and user-friendly, and most importantly, to avoid mistakes. For actions that are high-risk, it’s important that you don’t leave these out in the open and instead ensure that there is one click of distance between “Edit Mode” and “View Mode” - and this is where your modals come in.
✨Good For✨
👎🏻Not-so-good For👎🏻
Top Tips:
A ListView component is one of those components that everyone thinks makes a lot of sense for their application at first, but then quickly realizes that the table component is actually a lot more straightforward. I’m going to steal Kelly’s explanation of Listviews from here, and you can read more about ListViews in her S3 Uploader tutorial.
ListViews give you the chance to use all kinds of different components within them, from images to upload buttons to pdf viewers and more - all of which are limited within the table component capabilities.
In general, listViews are useful when the workflow includes engaging with a row of data multiple times, so a table is great for single-click actions, but if you need to enact several processes on a single row of data, a listview is probably better.
A con of listViews, however, is the sizing, and the way in which you can view your data, as with several components per row, they can become quickly clunky. So, if you are looking for a way to neatly present and evaluate your data, a listView might not be it. You could opt for a table with a side panel instead.
✨Good For✨
👎🏻Not-so-good For👎🏻
And with that, we have covered some of the most common CRUD layouts in Retool, and hashed out some of their pros and cons. Have something to add? We’d love to hear from you! You can email us at sophie@boldtech.dev, or tweet us at @bold_technology.
Joey and his team helped Vial build our internal tools. Bold Tech was great to work with and were consistently thoughtful, communicative and had a high quality bar for their work.
Bold Tech is the go to for all Retool work. Save your engineering team the hassle and partner with them, you wont regret it.