Skip to content

Commit 3aa96f2

Browse files
committed
chore(release): 3.4.0
1 parent bf382b0 commit 3aa96f2

11 files changed

Lines changed: 23 additions & 12 deletions

File tree

‎.github/ISSUE_TEMPLATE/bug_report.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ body:
3434
id: version
3535
attributes:
3636
label: OpenGridX version
37-
placeholder: "3.3.0"
37+
placeholder: "3.4.0"
3838
validations:
3939
required: true
4040
- type: dropdown

‎CHANGELOG.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
---
77

8-
## [Unreleased]
8+
## [3.4.0] — 2026-10-08
99

1010
### Added
1111

‎CLAUDE.md‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ This file is auto-loaded by Claude Code and other AI coding assistants. It provi
1414
- **Build:** `npm run build:lib` produces the published `dist/opengridx.es.js` / `dist/opengridx.umd.js`. `npm run build` type-checks the lib and builds the **demo site**.
1515
- **Published:** yes — on npm as `@opencorestack/opengridx` with external consumers. Treat public types and behaviour changes as semver-relevant.
1616
- **Lint:** `npm run lint` (ESLint). Must pass before every commit.
17-
- **Current version:** 3.3.0
17+
- **Current version:** 3.4.0
1818

1919
---
2020

@@ -153,6 +153,17 @@ The GitHub wiki is generated from `docs/` + `wiki/` by `scripts/build-wiki.mjs`
153153

154154
---
155155

156+
## v3.4.0 — significant changes
157+
158+
- **Batch edits**: paste, range clear, undo and redo commit through `useGridBatchEdit.applyEdits` — one `processRowUpdate` per row (rows in parallel, a failing row reported through `onProcessRowUpdateError` without blocking others) and one `REPLACE_ROWS` store update for all successful rows. `getRow` sees rows stored since the last render. Single edits store through `storeRow`. Shared helpers in `lib/utils/editing/commit.ts`; edit targets (rows × range columns, same indices as `cellSelection.getCurrentRange().resolved`) in `lib/utils/editing/targets.ts`
159+
- **Hook order** (see `docs/architecture/datagrid-orchestration.md`): `useGridEditCommitChannel` (12a) and `useGridBatchEdit` (12b) before `useGridEditing`; `useGridClipboardPaste` (36b) after `useGridCellSelectionApi`, then `useGridUndoRedo` (36c). Commits reach the history through the channel's `emit(changes, source)`; history ignores `'undo'` / `'redo'` sources
160+
- Paste, Delete/Backspace and Ctrl/Cmd+Z / Shift+Z / Ctrl+Y are **native listeners on the grid root**, gated by `classifyKeyTarget` (`'grid'` / `'control'`) and no open editor, so an editor's own paste and undo keep working
161+
- **History**: an action is recorded only after `processRowUpdate` succeeds, as `{ id, field, before, after }` with `after` read from the stored row via `getCellValue`. Undo writes `before` expecting `after` (redo the reverse); stale cells are skipped `'changed'`, removed rows `'missing'`; values are compared, not row identity
162+
- **Parsing**: `lib/utils/parsing.ts` (`parseTsv`, per-type `parse*Text`, `parseValueByType`, `parseCellText` with `valueParser`) is pure and the single parser for paste and `/ai` (`lib/ai/coerce.ts` only adds typed-JSON handling on top). Keep its regexes linear
163+
- **`/ai` entry point** (`lib/ai/`, no React, no dependencies): ships as `dist/ai.es.js`, `dist/ai.cjs` (`.cjs` because the package is `"type": "module"`) and `dist/ai.d.ts`, built by a second `vite.config.lib.js` run (`--mode ai`). `check-bundle` enforces no imports, no react, ≤ 5 KB gzipped (≈ 4.6 KB now) and that the core bundles don't contain the marker `'OpenGridX grid state'`. Demo, Vitest and tsconfig alias `@opencorestack/opengridx/ai` before the root alias. `lib/ai/columns.ts` is the single source of which columns each part allows; the validator reads own keys only, never `__proto__`, caps lists at 200 and errors at 100, and never throws (fuzz test)
164+
- **Shared inputs**: `Input` is `forwardRef` with `variant: 'field' | 'cell'` and `inputClassName` (`className` stays on the wrapper); `error` sets `aria-invalid`. Built-in search boxes, the filter value box and text/number/date editors render through `Input`; the boolean editor and list-view checkbox through `Checkbox` (hidden `<input>`: tests click `.ogx-checkbox__box`). The boolean editor needs `preventDefault` on mousedown on the whole `.ogx__edit-boolean` div. Browser tests that click styled controls must import `lib/styles/opengridx.css`
165+
- Browser paste tests copy from a textarea and press the paste shortcut (`ControlOrMeta+V`); Firefox drops `clipboardData` on a synthetic `ClipboardEvent`
166+
156167
## v3.3.0 — significant changes
157168

158169
- **Cell range selection** (`cellSelection`, design: `docs/superpowers/specs/2026-10-01-cell-range-selection-design.md`). `useGridCellSelection` runs after `useGridSpanning` and before `useGridKeyboardNavigation` (feeds it `cellSelection.keyboard`); `useGridCellSelectionApi` runs after `useGridPointerFocusHandlers`, keeps the anchor in sync with `focusedCell` and installs the six `apiRef` methods. Pure helpers in `lib/utils/cellSelection.ts`

‎demo/App.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export default function App() {
159159
<img src={`${import.meta.env.BASE_URL}logo.png`} alt="OpenGridX Logo" className="app-logo" />
160160
<h2 className="app-title">
161161
OpenGridX
162-
<span className="app-version">v3.3.0</span>
162+
<span className="app-version">v3.4.0</span>
163163
</h2>
164164
</div>
165165

‎demo/Home.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default function Home(_props: HomeProps) {
6363
<div className="home-logo-hero">
6464
<img src={`${import.meta.env.BASE_URL}banner.png`} alt="OpenGridX Logo" className="home-banner-image" />
6565
</div>
66-
<span className="home-badge">OpenGridX v3.3.0</span>
66+
<span className="home-badge">OpenGridX v3.4.0</span>
6767
<p className="home-subtitle">
6868
The elite, high-performance DataGrid for modern React.
6969
Built to handle massive data with a premium developer experience.

‎demo/public/llms.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# OpenGridX — AI Agent Context
22
# Package: @opencorestack/opengridx
3-
# Version: 3.3.0
3+
# Version: 3.4.0
44
# Docs: https://opencorestack.github.io/OpenGridX/
55
# This file is machine-readable. AI developers: start here.
66

‎docs/roadmap.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ This document tracks the current status of features in `OpenGridX` and outlines
8383
| Release | Target | Headline | Also in it |
8484
| :--- | :--- | :--- | :--- |
8585
| **3.3.0** ✅ | shipped 7 Oct | **Cell range selection** (opt-in `cellSelection` prop): mouse drag, Shift+click, Shift+arrows; Ctrl+C / Cmd+C copies the block as TSV | Selection status bar (count, sum, average of selected cells); wrapped header text; React Compiler compatibility check |
86-
| **3.4.0** | 20 Nov | **Paste from Excel / Google Sheets** into the selection, through `processRowUpdate` (values parsed per column type, non-editable cells skipped, `onClipboardPasteError`). **Undo / redo** for cell edits and pastes (Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y, `apiRef.undo()` / `redo()`) | **AI toolkit, part 1** in a new `@opencorestack/opengridx/ai` entry point: `getGridAiSchema(columns)` (JSON Schema of the filter, sort, grouping, aggregation, pivot and visibility models the columns allow) and `validateGridAiState(json, columns)` (drops unknown fields and operators, coerces values, returns errors) |
86+
| **3.4.0** ✅ | shipped 8 Oct | **Paste from Excel / Google Sheets** into the selection, through `processRowUpdate` (values parsed per column type or `valueParser`, non-editable cells skipped, `onClipboardPaste` summary); **Delete clears a range**; built-in inputs and editors use the shared `Input` / `Checkbox` (`Input variant="cell"`). **Undo / redo** for cell edits and pastes (Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y, `apiRef.undo()` / `redo()`) | **AI toolkit, part 1** in a new `@opencorestack/opengridx/ai` entry point: `getGridAiSchema(columns)` (JSON Schema of the filter, sort, grouping, aggregation, pivot and visibility models the columns allow) and `validateGridAiState(json, columns)` (drops unknown fields and operators, coerces values, returns errors) |
8787
| **3.5.0** | 15 Dec | **AI toolkit, part 2**: `aiAssistant={{ onPrompt }}` prompt panel that calls the app's own model, shows the proposed changes as removable chips and applies them with undo; `createGridAgentTools(apiRef)` (plain tool objects for CopilotKit, the Vercel AI SDK or WebMCP) | Header filter row; **fill handle** as a stretch goal (moves to Q1 2027 if 3.3–3.4 run late) |
8888
| Freeze | 19 Dec – 5 Jan | Bug fixes only | — |
8989

‎llms.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# OpenGridX — AI Agent Context
22
# Package: @opencorestack/opengridx
3-
# Version: 3.3.0
3+
# Version: 3.4.0
44
# Docs: https://opencorestack.github.io/OpenGridX/
55
# This file is machine-readable. AI developers: start here.
66

‎opengridx-ai-context.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ that uses the `@opencorestack/opengridx` library. Read it in full before writing
88
## What this library is
99

1010
`@opencorestack/opengridx` is a zero-dependency, high-performance React DataGrid component.
11-
Current version: **3.3.0**. It is a full custom implementation — not a wrapper around MUI or any
11+
Current version: **3.4.0**. It is a full custom implementation — not a wrapper around MUI or any
1212
other library.
1313

1414
---

‎package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)