Compact Lists
A dashboard-sized pattern: two lists of five, each with its own view. Side by side on desktop, stacked below it. No search, filter or paging, because a short list does not need them.
Best for: Dashboards, home screens and sidebars.
Two parts to paste. The Screen YAML and the App.Formulas. The formulas are the same for all ten patterns, so an app with several of them needs that block once. Without it the screen has no colours, sizes or sample rows — or download the .msapp to skip the paste.
Preview and code
Wireframe — screenshots coming soon
Three views
Newest, Due soonest, Overdue
Two lists
Each with its own choice
Reflows
Side by side on desktop, stacked below
Progress line
Step 2 of 4 under each title
How it works
The 3 techniques that make this pattern work on a list big enough to matter.
The first five, correctly
Each view sorts on the server and FirstN takes the top. FirstN itself is local, but it runs on rows SharePoint already ordered, so the five are right however long the list is.
Open is an Or of equalities
StatusKey <> "Completed" does not delegate on SharePoint, so open is written as the three open statuses.
(StatusKey = "NotStarted" || StatusKey = "InProgress" || StatusKey = "OnHold")A row stretched in a row collapses
The panels sit in a row whose height is the taller panel's. Stretching the panels to the row's height made each depend on the other and both rendered empty, so on desktop they align to the top instead.
Connect to SharePoint
It ships on sample rows. The queries are already written the way SharePoint needs, so switching is a rename rather than a rewrite.
- Add your list as a data source.
- In
OnVisible and each view dropdown's OnChange, replacecolTblItemswith your list (the Filter(colTblItems, ...) in each view's query). - Delete
nfSeedTblItems();from the screen’s OnVisible. - If your columns are named differently, rename them in the screen, or add matching columns to the list.
- Index these columns:
Created,DueDate,StatusKey.
The columns the patterns read
| Column | Type | Used for |
|---|---|---|
| Title | Text | The item's name; searched and sorted |
| ItemKey | Text | A unique reference, e.g. ITM-0042; searched, and the selection key |
| Owner | Text | Who the item belongs to |
| OwnerEmail | Text | The owner's email |
| StatusKey | Text | NotStarted, InProgress, OnHold or Completed |
| CategoryKey | Text | A key from nfTblCategories |
| PriorityKey | Text | High, Medium or Low |
| Amount | Number | A money value |
| DueDate | Date | When it is due; overdue rows turn red |
| Created | Date and time | Built in on a SharePoint list |
Rules that keep it working past 5,000 rows
- Every filter on a growing list must delegate: equality on an indexed column, StartsWith on text, and And or Or of those. in, Search() and <> do not delegate on SharePoint.
- An "All" choice must send no condition. Put the If outside the Filter and test the key with IsBlank, never with = "": a blank key compared with a column filters on blank and returns nothing.
- Sort with one literal SortByColumns per column. A column name held in a variable does not delegate.
- Index every column you filter or sort on before the list passes 5,000 items. Past that, SharePoint refuses an unindexed filter or sort outright.
- CountRows, Sum and Average do not delegate. Show rows loaded rather than a total, or keep totals in a list a scheduled flow maintains.
Get new components and templates when they drop
One email when something new ships. Unsubscribe anytime.
Community
Use the toolbar to format · or type markdown directly