Repository navigation
Add form events that run declarative actions - #58
Merged
Merged
Conversation
…ator Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbiHdEqFVn5g9qhRXNvbiX
…uilds Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbiHdEqFVn5g9qhRXNvbiX
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbiHdEqFVn5g9qhRXNvbiX
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbiHdEqFVn5g9qhRXNvbiX
…p criteria to DuckDB Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JeeNa946LqRHZZjLxBERLz
- PRD §4.5 billing model (per app, org pays, annual = 2 months free, no trial, USD from a Singapore sole proprietorship) and §20.3 per-app access. - Migration: app_collaborators, app_capabilities(_for), capability-based RLS, plans.annual_price_cents (check = 10x monthly), subscriptions.billing_interval, org_billing_customers. - Edge Functions: app-access-update; billing-checkout takes interval and bills the org's single customer; webhook resolves plan and interval from the price; admin checks share app_capabilities_for. - Website: Access tab, capability-gated read-only tabs, Monthly/Annual toggle on Billing and Pricing. - service-qa contract and UI specs, Deno tests, decision records. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FnMtGVhp92898pMda24XBU
…ects they became Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JeeNa946LqRHZZjLxBERLz
Forms bind a declarative action to each event (PRD §17.4). Before update vetoes the save when its action fails; after update reports a failure without undoing the save. Config version 5 adds Form.events. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tafn1n7Y2WYuRXBsW3r2Fo
|
🚀 Web preview: https://preview-58.ixtable.pages.dev |
Continuous forms repeat the form's grid per record and save rows in place; split forms show the list above the selected record. Detail views can show a first/previous/next/last/new bar that walks the list's order. An openForm step can open a popup and wait for its saved record or a closeForm value. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nu61xuJiarU1GUM2djPXyj
Running sums accumulate a field or calculated value over the rows or group instances printed so far, over the enclosing group or the whole report. Text components take conditional formatting rules (bold, text gray, fill) evaluated with the component's value. A chart component draws bar, line, area, pie, donut and scatter charts with the dashboard chart data and geometry, as one chart item of paths and text that preview and PDF draw alike. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CCUeHtApaLW2nLJEdDErJd
src/reports/ matches the reports/ ignore rule, so new files there need git add -f. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CCUeHtApaLW2nLJEdDErJd
An older build would drop Form.navigationBar on save and reject the continuous and split modes, so it must refuse these documents. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nu61xuJiarU1GUM2djPXyj
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tafn1n7Y2WYuRXBsW3r2Fo
Related lists now open child forms that show their own related lists, up to three levels below the opened form; validation rejects deeper chains and loops, the designer only offers forms that fit, and Runtime guards the depth. Reports gain a subreport component that prints another report inside a band, linked by child and parent fields, for invoices and statements. Layout expands it into ordinary band instances so pagination stays deterministic. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FZkDyoVBe41qkCf1KCJfn6
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nu61xuJiarU1GUM2djPXyj
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JeeNa946LqRHZZjLxBERLz
The root .gitignore entry reports/ also matches src/reports/, so the new file was left out of the previous commit. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FZkDyoVBe41qkCf1KCJfn6
Field settings on each entity layer formats on text and JSON columns: sanitized rich text, attachment files stored in the record store's hidden _ixtable_attachments table and read through DuckDB, multi-select JSON arrays, and Access-style input masks checked on entry. Forms, lists, the datasheet, and table-sourced reports use them; the table designer edits them. Decision record in docs/decisions/field-formats.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWgr5aR41RSBVb1dYrZR12
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CCUeHtApaLW2nLJEdDErJd
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWgr5aR41RSBVb1dYrZR12
Embedded forms skipped their related lists, which kept nesting at one level. The depth guard in RelatedRecords now limits nesting instead. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FZkDyoVBe41qkCf1KCJfn6
Contributor
Author
|
Neither test opens a form or uses an event, and both pass on macOS for this same commit. This PR's integration test also passes on macOS. I think these are Windows timing failures, but that is not confirmed yet. I'll re-run the failed job once when this run finishes. If they fail again, I'll treat them as real and investigate. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QWgr5aR41RSBVb1dYrZR12
Also label chart components 'bar chart: amount' on the canvas and call the unchanged condition style 'As is' so it fits its select. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CCUeHtApaLW2nLJEdDErJd
…nd filter styling Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JeeNa946LqRHZZjLxBERLz
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tafn1n7Y2WYuRXBsW3r2Fo
… not overlap Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FnMtGVhp92898pMda24XBU
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FZkDyoVBe41qkCf1KCJfn6
…eenshots A row saved by leaving it showed its old value: the page re-read after the save could land after the rows remounted. Rows now key on their record and take new stored values unless they hold unsaved edits, so the new-record row also keeps what was typed. A fixed actions column keeps fields aligned. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nu61xuJiarU1GUM2djPXyj
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts: # src/reports/data.ts # src/runtime/RelatedList.tsx
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Ziinc
marked this pull request as ready for review
October 12, 2026 22:48
This branch was successfully deployed
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.
Requested by Zn · project thread
Form.events(siblings adding nested fields will need to rebase onto 5)scripts/screenshot/specs/form-events.spec.tsxcaptures the designer, on load, veto and after update🤖 Generated with Claude Code
https://claude.ai/code/session_01Tafn1n7Y2WYuRXBsW3r2Fo