Build your app's report tree — folders, friendly names, sub-folders
Folders, friendly names, and what your users actually click on. The Report Tree is the user-facing translation of everything you set up in the last lesson.
By the end of this lesson
- A user-facing field tree organized by folders
- A clean catalog Composer users can navigate without hitting columns they shouldn't see
You'll need
- Categories with working database views (from Build your first app)
- A shortlist of the fields users actually need per category
- A list of fields that absolutely must not be exposed
Background
The Report Tree is the bottom section of the App Builder accordion, sitting just below Database View. If Database View is the technical inside of a category (tables, joins, schemas), the Report Tree is the user-facing outside — folders, friendly field names, the experience your Composers actually have when they pick "Select an App and Category" and start building reports.
Two pieces of context to anchor:
- The Report Tree is your access control surface. Fields you don't add here, Composers can't see — even if those fields are sitting right there in the underlying database tables. That's a feature: it means the Report Tree is where you decide what's exposed and what stays hidden. PII, audit columns, internal scoring fields — leave them out.
- Folder names and field names should match how your team thinks, not how your DBA named them. Database column names are an artifact of how the schema was built; users almost never want to see
cust_nm_lstin their report. The Report Tree is where you translate.
A quick before/after — the translation
What's in your database vs. what your users actually want to see:
The renames don't change the underlying SQL — DashboardFox still queries the real column name. They only change what users see and search on. You can rename fields after the fact too; existing reports keep working because the SQL identity is unchanged.
Stuck on folder structure or which fields to expose? Email team@dashboardfox.com with what you're modeling — we'll talk through it. Real human, same business day.
Do it
-
Open the Report Tree section
From App Builder, with your app picked in App List and your category configured in Categories, expand the Report Tree section at the bottom. (Quick shortcut from the Database View section: click Configure Report Tree — it jumps you straight here.) Initially, the report tree is empty — no folders, no fields. The status reads NA until you've added something.
The layout is two panes: a folder tree on the left with a search bar and a Folder dropdown control for adding new folders, and a field list on the right with columns for Display Name, Data Type, SQL Name, and Actions, plus a Search Fields input and an Add Field To Folder button.
-
Create your folders
Click the Folder dropdown above the folder tree and choose to add a folder. Give it a name — this is what Composers see when they pick this category, so keep it user-friendly (e.g.,
Tickets, notservice_data_table).Add the parent folders you planned. Don't worry about getting it perfect on the first pass — you can rename, reorder, and reshuffle later. A reasonable starter for a tickets category:
Tickets,Customer,Location,Assignee.For sub-folders, click into the parent folder first to select it, then use the Folder control again — the new one nests inside the selected parent. A common sub-folder pattern: a
Dates & Timessub-folder underTicketsto group all the timestamp fields together.Useful to know: empty folders don't render in Composer. So you can build your full folder structure upfront — including ones you haven't filled yet — and they'll only appear to users once they have fields in them. Useful for laying out the skeleton in a planning session.
-
Add fields — pick the table, pick the columns
Click into a folder, then click Add Field to Folder. You'll see a table picker — these are the tables and views from your database view (not all of the database). Pick the source table for this folder.
You'll see every column in that table. Check the ones you want to expose. Skip: primary keys, foreign keys, audit columns, internal flags, anything sensitive. Most of what you skip is IDs — they don't add value to a user's report.
If you want most of a table's columns: click Select All, then uncheck the few you don't want. Faster than clicking each one.
For each field, you'll see two name fields side by side — the SQL name (the actual database column, read-only here) and the display name (what users will see). Rename the display name now. Easier to do at add-time than to edit each field later. Apply your naming convention —
designation→Title,cust_nm_lst→Last name, etc.The data type is shown for each column too — datetime, integer, real number, string. Sanity-check it. If a date column is showing as string, something is off in the source data — note it; the formula-fields lesson covers casting.
Click Add Fields. They appear in the folder.
-
Reorder with drag-and-drop
Each field in the folder has a small drag handle on the left. Drag fields up or down to reorder — the order here is the order users see in Composer's field picker. Put the most-used fields at the top of each folder.
Same for folders themselves — drag them in the parent list to reorder.
-
Test in Composer — open it in a new tab
This is the most important step. Right-click the Composer menu item and open it in a new tab. Pick your app, pick the category. Your folders and fields should all be there exactly as you laid them out.
Build a test report by picking fields from multiple folders — one field from Tickets, one from Customer, one from Location, etc. If you get a preview with data, your joins from the previous lesson are valid and your report tree is wired correctly. If you get a SQL error, something's off — go back to the database view, fix the join, refresh Composer, try again.
Stay in this loop until pulling fields from any reasonable combination produces a valid preview. This is the acceptance test for the category.
-
Repeat per category, then move on
Each category has its own report tree. Configure them one at a time. When all your categories produce clean Composer previews, the app is ready for users — at least functionally. The next lesson covers how to add formula fields (calculated dates, casts, concatenations) when raw columns aren't enough.
You have a working connection. Below is what to tighten before real users see it. Skip if you're just testing.
Make it real
The 20-field rule (and when to use sub-folders)
Folders past 20 fields become hard to scan. Users scroll, miss things, and rebuild reports because they didn't realize the right field existed. When a folder approaches that size, look for natural sub-groups and break them out as sub-folders.
Ticket status
Business status
Priority
Service type
📁 Dates & Times
Opened on
Resolved on
Last updated
Due date
📁 Customer
Customer name
Customer type
Channel
📁 Assignee
Assignee name
Title
Manager
The split above keeps each level readable. A user who wants ticket dates knows exactly where to look; a user who wants customer info isn't wading through ticket fields to find it.
Hide IDs, keys, and audit columns
Primary keys and foreign keys are the plumbing of joins, not data users want in reports. Same for audit columns (created_by, updated_at, row_version) — they're useful for debugging schema issues, not for business reporting. Leave them out unless someone has a specific reason. If you exposed them and now want them gone, edit the field and delete it from the folder; the column is still in the underlying table for joins, just not visible to Composers.
The Report Tree is your access control — treat it that way
If a sensitive field is in the database, your only real defense against it appearing in a report is not adding it to the Report Tree. Database grants are a backstop, not the primary control: as long as the integration's account can SELECT the column, an App Builder can pull it in.
Practical hardening: keep a written list of "do not expose" fields per category. Audit the Report Tree against the list before you grant the app to users. For really sensitive data, consider a database view that simply doesn't include the field — defense in depth. Row-level security (covered in Module 4) restricts which rows users see; the Report Tree is what restricts which columns.
Naming consistency across the team
If multiple people are App Builders, agree on conventions early. Casing — all lowercase, Title Case, Sentence case — pick one. Abbreviations — spelled out ("Identifier") or abbreviated ("ID"). Date suffixes — "on" (Opened on) vs. "date" (Open date). None of these is right or wrong; consistency is what matters.
An app where half the fields are customer name and half are Customer ID looks unfinished, even if functionally everything works. A short style guide pinned somewhere shared (a doc, a wiki) saves hours of "should this match that?" debates later.
When the same table is aliased twice — disambiguate display names
If your database view aliased a single source table twice (covered in Build your first app — the contact-table-as-customer-and-partner pattern), the report tree needs to show that disambiguation, or your users will get confused datasets.
The pattern: build separate folders for each role of the aliased table. Example with cust_contact and part_contact — create a Customer Contact folder pulling from the cust_contact alias, and a Partner Contact folder pulling from the part_contact alias. Same source table, two different aliases, two different folders.
Then rename every field that shows up in both. If both folders have a column called name, exposing both with the display name Name means a Composer building a report sees two columns called Name and has to remember which folder each came from. Rename to Customer Name and Partner Name. Same for email, phone, address — anything that's likely to show up in the same report alongside its sibling.
Two columns from the same row of result data sharing a header is the trap. Disambiguating at the display-name level prevents it without your users having to think about it.
The Composer test loop is the acceptance step
Don't declare a category done because the Report Tree looks right in App Builder. Open Composer, pick fields from across folders and tables, and confirm: previews load, names look correct, data types make sense, no surprise SQL errors. Issues found here are usually 30-second fixes; the same issues found by users a week later mean rebuilding reports.
When two tables in the same category don't join
Sometimes two tables genuinely belong in the same category but have no valid join — the canonical example is finance, with a balance sheet and an income statement that share no key. The video walks the recommended pattern: put the un-joinable tables in separate folders (e.g., Income Statement and Balance Sheet), and educate users that fields shouldn't be combined across those folders. The folder boundary becomes a visual cue.
This works because Composers building reports tend to stay within one folder unless they have a specific reason to span. The folder structure plus a one-line note in the app description is usually enough. If your audience doesn't read app descriptions and you can't tolerate cross-folder mistakes, the alternative is splitting into separate categories — sometimes separate apps.
What to avoid: putting fields from un-joinable tables in the same folder. That guarantees SQL errors when users combine them, with no visual hint that they're forbidden combinations.
Bulk move and reorganize
Moving fields one at a time is fine for a few; tedious for a folder full. The Report Tree supports bulk operations. In any folder's field list, the column header has a checkbox — clicking it selects every field in the folder. You can also click individual row checkboxes to select a specific subset.
Once you have a selection, two icons appear next to the column-header checkbox: a stacked left/right arrow (the move action) and a trashcan (bulk delete). Move opens a folder picker — pick the destination, confirm, done. The selected fields land in the new folder in the same order; everything else stays put.
Use this whenever you've outgrown a folder's size (the 20-field rule above), spun up a new subfolder for grouping (Calculations, Date Parts, Identifiers), or are reorganizing post-import. The formula-fields lesson will produce a lot of new fields; bulk-move is how you tidy up afterward.
Clone before redesigns
Heavy report-tree work — restructuring folders, mass renames, re-organizing for a new audience — benefits from a clone of the category as a known-good fallback. The clone option lives on the action menu of each category. Tiny safety net, occasionally saves a half-day of "what did I change again?"
If you're stuck
The classic stumbles, plus the one most novices hit on day two.
I added fields from two tables in one folder and now reports get a SQL error
The two tables aren't joined in the database view, so DashboardFox can't generate valid SQL when fields from both are combined. Two ways to fix. If they should be joined: go back to the database view, find the join key, build the join. If they genuinely don't join (e.g., balance sheet and income statement): split them into separate folders. Same category is fine; same folder is the trap. The Block 4 card above covers the strategy in detail.
Users can't find a field they know exists
Almost always a folder size issue. Folders past 20 fields become a wall of text. Look at the folder, find the natural sub-groups (dates, identifiers, contact info, etc.), and break them out as sub-folders. Field names are searchable in some Composer pickers, but folder structure carries most of the discoverability.
A field is showing in Composer with its cryptic database name
The display name was never overridden. Edit the field in the Report Tree (action menu on the field row → Edit) and set a friendly display name. The change applies immediately on the next Composer refresh; existing reports keep working because the SQL identity hasn't changed.
Sensitive data showed up in a report — how did it leak?
It was added to the Report Tree. Database grants and row-level security don't restrict which columns a Composer can pick — only the Report Tree does. Audit the field list against your sensitive-fields list. Remove anything that shouldn't be exposed; the underlying column stays in the database for joins, but Composers won't see it. Going forward, treat the Report Tree as the access control surface, not as a "convenience" layer.
My data-type column shows the wrong type for a field
Two cases. Source data is wrong: a date column stored as text in the database. The fix is in the database (or via a database view that casts it correctly). Source data is fine, you want a different exposure: edit the field in the Report Tree and override the data type. The formula-fields lesson goes deep on casts and conversions, including when to use them and when to fix at the source.
Composer test was clean, but users are seeing different results than I do
You're testing as an Admin / App Builder, who typically has full data access. Users may have row-level security (Module 4) restricting which rows they see. Test as a user impersonation if your DashboardFox has it, or have a real test user run the same report and compare. The Report Tree itself is fine; this is downstream.
None of these match my situation
Email team@dashboardfox.com with a screenshot of the folder structure and what's not working. We'll trace it. Same business day.
