Iterating a DataView pattern in a SaaS design system

Design note

UX pattern design

design system

This is not a feature case study. It focuses on design system evolution and the reasoning behind it.
Area of work

Pattern design

Time frame

2025

Team work

PM and developers

Ownership

End-to-end design (discovery → delivery)

Collaboration

PMs, developers

Last edited

January 2026

Context

In WFM SaaS I worked on, users work with large sets of entities—people, schedules, requests, rules—and constantly associate, filter, and modify them through CRUD workflows.
Over time, this led to many different data views across the product: tables, lists, timelines, each built for a local need.

While each view worked in isolation, the overall experience didn’t scale well. From a design system perspective, we were missing a shared DataView pattern that designers and engineers could reuse consistently—both visually and in code.

This design note reflects on how I iterated that pattern, what broke in the first version, and what I learned while reconciling UX intent with technical constraints.

Problems

After surveying existing usages, several inconsistencies emerged:

image placeholder: survey

Structural fragmentation

Filtering inconsistencies

UX cost

The underlying issue wasn’t visual polish—it was the absence of a shared mental model for what a DataView is and how it should behave.

1st Iteration

Based on the shared usage analysis, I introduced an initial DataView pattern in the design system.

Core idea

The DataView standardizes views that organize and display collections of data efficiently, while allowing controlled customization for searching, filtering, and actions.

It was intended to support:

Anatomy

tbd

The pattern was structured into three sections:

  1. Header
  2. Data
  3. Footer
tbd

Two variants existed:

Data

tbd tbd

The goal was consistency without over-constraining product teams.

Demo

Without primary slot

tbd

With primary slot

tbd

Lessons from 1st Iteration

Once the pattern was used in real products, its weaknesses surfaced quickly.

Technical friction exposed UX gaps

AreaIssue
Default filters- Default filters could not be active without showing a filter pill
-This forced technical transparency into the UI, even when it harmed clarity
Primary slot filters- Not part of the filter schema
- No standard API
DataView flexibility- No date-range filter type
- No support for summary or footer data
The biggest issue wasn’t missing features—it was conceptual.

“primary-slot” problem

Mental model mismatch

We used form components for primary filters, but this felt wrong:

Confusing boolean filters

Show opposite value via checkbox, it is not boolean logic:

tbd

Responsive layout issues

2nd Iteration

The second iteration focused less on UI tweaks and more on clarifying intent.

AreaChangeResult
Primary filters as new categoryRedesign primary filter to be a distinct category with clear rules and behaviorRemoved ambiguity and aligned filtering with real user intent
Boolean logicStandardized boolean filters as tri-state (All / true / false);
Defaults shown in permanent slot
Removed ambiguity and aligned filtering with real user intent
Action labelsRenamed “Clear filters” to “Reset filters” to restore all defaultsClarified scope and matched user expectations
Responsive layoutAligned permanent and optional filters in a single rowSaved vertical space and improved cross-device clarity
API alignmentPassed full server responses; standardized date, time, and duration filtersEnabled summaries, richer footers, and scalable DataViews

Key changes in header

tbd

UI improvements

1st iteration →

tbd

1st iteration →

tbd

Outcome

The refined DataView pattern resulted in:

Even without hard metrics yet, the qualitative impact was obvious in day-to-day work.

tbd

Key Learnings