Skip to content

feat(views,web): Airtable-grade database grid chrome + exploration 0199 - #173

Merged
crs48 merged 10 commits into
mainfrom
feat/0199-notion-grade-database-ui
Jun 18, 2026
Merged

feat(views,web): Airtable-grade database grid chrome + exploration 0199#173
crs48 merged 10 commits into
mainfrom
feat/0199-notion-grade-database-ui

Conversation

@crs48

@crs48 crs48 commented Jun 18, 2026

Copy link
Copy Markdown
Owner

Summary

Exploration 0199 maps the path to a Notion/Airtable-grade database UI (full filtering/sorting/grouping/joining + workspace-wide native queries) and how the visual builder should unify with the dev-tool query console. The headline finding: xNet's data engine is already Airtable-class (executeQuery, QueryAST with relation joins + aggregates, QueryRouter), but the UI doesn't surface it and the grid chrome bypasses the design system.

This PR also ships Phase 1 — "Airtable-grade grid chrome", the highest-leverage, lowest-risk, most-visible slice:

  • Summary footer (GridSummaryBar) — per-column, type-aware aggregations (Sum/Average/Min/Max/Range/Median, Filled/Empty/% , Unique, Checked/%, Earliest/Latest) picked from a polished @xnetjs/ui menu. Backed by a pure, fully-tested summary-engine in @xnetjs/data.
  • Row-height density — a Short/Medium/Tall/Extra-tall control in GridToolbar; GridSurface already accepted rowHeight but the app never set it.
  • Design-system field pickersDatabaseView's native <select> field-type pickers replaced with the @xnetjs/ui Select + human-readable labels.
  • Both row height and column summaries persist per view (two optional DatabaseView schema props + useGridDatabase.setRowHeight/setColumnSummary).

Later phases (deferred, tracked in the exploration checklist): nested/relation filters and unifying the two filter dialects, multi-level sort UI, grouped-row rendering, frozen columns, and the visual-builder ↔ native-query-console unification.

Verification

  • summary-engine unit tests (26) green; GridSurface/GridToolbar/useGridDatabase tests (42) green; full packages/data schema (429) + database (713) suites green.
  • Typecheck + eslint + prettier clean across @xnetjs/data, @xnetjs/react, @xnetjs/views, xnet-web.
  • Verified live in Storybook (Grid V2 story): Points→Sum 29, Shipped→Percent checked 25%, Status→Filled 4, and the Tall row-height tier densifies the grid. (Full-app screenshot was blocked by the fresh-origin passkey gate; the field-type Select swap is typecheck-verified.)

Changelog

  • Database grids gain an Airtable-style summary footer with per-column, type-aware aggregations.
  • New row-height control (Short / Medium / Tall / Extra tall), persisted per view.
  • Field-type pickers in the database view are now the polished design-system Select with readable labels instead of native dropdowns.
  • Added exploration 0199 (Notion/Airtable-grade database UI and native queries).

🤖 Generated with Claude Code

xNet Test and others added 9 commits June 17, 2026 16:24
…ve queries

Changelog: Added exploration 0198 mapping the database UI to Notion/Airtable
parity (filter/sort/group/join + workspace-wide native queries) and the path to
unify the visual builder with the dev-tool query console.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pure, type-aware per-column aggregations (computeColumnSummary +
SUMMARY_FUNCTIONS_BY_TYPE) and named row-height tiers (ROW_HEIGHT_PX), plus
two optional DatabaseView props (rowHeight, columnSummaries) so density and
footer summaries persist per view. 26 unit tests.

Changelog: Database grids gain an Airtable-style summary engine and
row-height density model (UI wiring follows).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…198)

GridViewModel carries the persisted row-height tier and per-column summary
map; setRowHeight + setColumnSummary commit them to the DatabaseView node.
Re-exports the summary/row-height engine from the @xnetjs/data root barrel.

Changelog: useGridDatabase now reads/writes per-view row height and column
summary selections.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…field picker (0198)

GridSummaryBar renders per-column footer aggregations (styled @xnetjs/ui
menu); GridToolbar gains a row-height tier control; DatabaseView wires both
into useGridDatabase, passes the resolved row height to GridSurface, and
replaces the native field-type <select>s with the @xnetjs/ui Select using
human-readable labels.

Changelog: Database grids now have an Airtable-style summary footer, a
Short/Medium/Tall/Extra-tall row-height control, and polished field-type
pickers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wires GridSummaryBar and the toolbar row-height control into the in-memory
DemoGrid so the footer aggregations and density tiers are exercised in
Storybook (verified: Points→Sum 29, Shipped→Percent checked 25%).

Changelog: Grid V2 Storybook story now demonstrates the summary footer and
row-height control.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: Marked the summary-bar / row-height / field-picker Phase 1 items
of exploration 0198 as implemented and verified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…o 0199

Number 0198 was taken by two explorations (Linear tasks #167, page editor
#169) that merged to main while this branch was open.

Changelog: Renumbered the Notion/Airtable database UI exploration from 0198
to 0199 to resolve a number collision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-173 June 18, 2026 00:01 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

🖼️ UI changes in this PR

Components

✏️ Core/Database/Grid V2 — Comment Badges _(SSIM 0.939)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Files And Images _(SSIM 0.978)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Playground _(SSIM 0.939)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Presence _(SSIM 0.934)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Read Only _(SSIM 0.936)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Spreadsheet Ghost Cells _(SSIM 0.990)_
before after diff
before after diff
✏️ Core/Database/Grid V2 — Typeahead Tags _(SSIM 0.965)_
before after diff
before after diff

Auto-captured by CI · run. Informational — not a blocking check.

github-actions Bot added a commit that referenced this pull request Jun 18, 2026
@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Preview removed for PR #173.

github-actions Bot added a commit that referenced this pull request Jun 18, 2026
…(0199)

The rowHeight view prop is stored as text(); the RowHeight type import was
unused and tripped eslint no-unused-vars (CI lint).

Changelog: none (lint fix).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-173 June 18, 2026 00:06 — with GitHub Actions Inactive
github-actions Bot added a commit that referenced this pull request Jun 18, 2026
@crs48
crs48 merged commit 6e2de5b into main Jun 18, 2026
13 of 14 checks passed
@crs48
crs48 deleted the feat/0199-notion-grade-database-ui branch June 18, 2026 00:19
github-actions Bot added a commit that referenced this pull request Jun 18, 2026
crs48 added a commit that referenced this pull request Jun 18, 2026
## What

Backfills the changelog so it reflects what's live on `main`. The per-PR
fragment system (exploration 0197) was current through PR #163 (PR #178
backfilled #151/#153/#156/#157/#160/#163), but the recent **0198/0199
batch** and a couple of stragglers shipped without entries. This adds 7
fragments, with prose lifted from each PR's own `## Changelog` block
where present.

| PR | Entry | Tags |
|---|---|---|
| #143 | AI chat that knows your workspace | `ai` |
| #167 | Linear-grade Tasks | `tasks` `app` |
| #169 | Cleaner page editor typography | `editor` |
| #170 | Bring your Slack data into xNet | `plugins` `platform` |
| #171 | Smoother, more consistent motion | `app` |
| #173 | Airtable-grade database grids | `app` |
| #174 | A redesigned chat & channels experience | `app` |

## Deliberately excluded

- **In-editor AI (#154 / #158)** — shipped the transform engine +
diff/approval logic, but both PRs state the `/ai` UI wiring into the
running app is **deferred**, so it isn't user-visible yet. An entry
would overclaim.
- **Slack (#170)** — entry scoped to the migration connector +
compatibility layer (genuinely live); avoids claiming the
webhook/slash-command hub endpoints work, since they're
generic-over-an-injected-sink and not mounted in a running server yet.
- Pure infra/ops/docs PRs (cloud M1/M2, CI, runbooks) — not user-facing.

## Verification

- `validate-changelog.ts` → **26 fragments valid** (19 existing + 7 new)
- `prettier --check` on all new files → clean
- Newest-first ordering confirmed — the 7 entries slot in at the top

## Changelog

<!-- This PR only adds changelog fragments for already-merged work; it
ships no user-facing change of its own. -->

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant