feat(views,web): Airtable-grade database grid chrome + exploration 0199 - #173
Merged
Conversation
…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>
Contributor
🖼️ UI changes in this PRComponentsAuto-captured by CI · run. Informational — not a blocking check. |
Contributor
|
Preview removed for PR #173. |
…(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
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.





















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,QueryASTwith 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:
GridSummaryBar) — per-column, type-aware aggregations (Sum/Average/Min/Max/Range/Median, Filled/Empty/% , Unique, Checked/%, Earliest/Latest) picked from a polished@xnetjs/uimenu. Backed by a pure, fully-testedsummary-enginein@xnetjs/data.GridToolbar;GridSurfacealready acceptedrowHeightbut the app never set it.DatabaseView's native<select>field-type pickers replaced with the@xnetjs/uiSelect+ human-readable labels.DatabaseViewschema 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-engineunit tests (26) green;GridSurface/GridToolbar/useGridDatabasetests (42) green; fullpackages/dataschema (429) + database (713) suites green.@xnetjs/data,@xnetjs/react,@xnetjs/views,xnet-web.Selectswap is typecheck-verified.)Changelog
Selectwith readable labels instead of native dropdowns.🤖 Generated with Claude Code