Skip to content

Release v1.3.0 — LOOKUP columns#71

Merged
DDecoene merged 35 commits into
mainfrom
release/v1.3.0
Jul 13, 2026
Merged

Release v1.3.0 — LOOKUP columns#71
DDecoene merged 35 commits into
mainfrom
release/v1.3.0

Conversation

@DDecoene

Copy link
Copy Markdown
Owner

Summary

Test plan

DDecoene added 30 commits July 10, 2026 16:31
Declare a column's legal values once, on the column:

  SCHEDID CHAR(4) LOOKUP SCHEDULES.SCHEDID DISPLAY DESCR
  STAGE   CHAR(10) LOOKUP ("lead","demo","won","lost")

Forms, the BROWSE grid, REPLACE and grid-edit all inherit it. Field-bound
GET (GET SCHEDID, written back by READ) removes the memory-variable
round-trip, so the lookup has exactly one declaration site.

Defers #34 (Assistant Join / Work-areas wizards) to v1.4.0.
- ColumnMetaStore migration must be additive (ADD COLUMN): widening the
  drop-and-recreate check would erase released v1.2.0 users' declared types
- over-ceiling lookup resolution degrades to free text, never truncates —
  a clipped option list would reject legal values
- field-bound GET: fields shadow memvars (dBASE precedent, demos audited);
  records captured by rowid at READ and written like grid-edit
- form-submit: all-or-nothing validation, server-retained targets, new
  form-error message (forged-message test required)
- demo cleanup: RECNO()/GO rollback is unsound under an active index
  (rowPtr is index-order position); check-first two-form flow instead
- crm stage lookup uses the seeded vocabulary verbatim (case-sensitive)
Scoped honestly to what this PR delivers — parsing and persistence
only. Enforcement (BROWSE/REPLACE) and UI rendering land in #59/#60;
the README command reference is held back until then so it doesn't
advertise a constraint nothing enforces yet.
feat: LOOKUP column qualifier — grammar + storage layer (#58)
BROWSE/REPLACE now fully declare, enforce, and render lookups end to
end, so this is the first PR that promotes LOOKUP to the README
command reference (with an explicit Deviations note — no dBASE III
ancestor). Forms still don't offer a picker; that's #59.
feat: LOOKUP enforcement in REPLACE/grid-edit + BROWSE dropdown (#60)
Both BROWSE and forms now declare, enforce, and render LOOKUP end to
end, so this is the PR that adds the full command-table entry and
the field-binding precedence note to the README.
feat: field-bound @ SAY GET — promotes LOOKUP to full end-to-end (#59)
overtime.spec.ts gained a 10th test for the Add-Employee dropdown;
corrected the stale count in CLAUDE.md's test inventory.
feat: demos adopt LOOKUP columns — overtime + CRM (#61)
Notes the Assistant sidebar's parity with the raw-syntax LOOKUP
clause, and that this closes out the full lookup-columns milestone
(#58-#62).
feat: Lookup control in Table and Modify-structure wizards (#62)
Missed in the original wizard PR: docs/screenshots/*.png and the demo
GIF weren't retaken, despite the grid and form UI materially changing
(select editors, DISPLAY-labeled options). Regenerates all screenshots
via the existing scripts/capture-screenshots.mjs (now with two new
blocks for the BROWSE and form LOOKUP dropdowns) and adds them to the
README. The demo GIF is untouched — its command sequence never
touches a LOOKUP column, so it isn't stale, just silent on the
feature; not worth re-recording for this alone.
docs: refresh screenshots for LOOKUP columns (v1.3.0 DoD follow-up)
Adds a scene after the existing BROWSE segment: ALTER TABLE ADD a
literal-list LOOKUP column, reopen BROWSE, open the dropdown, pick a
value. The held final frame lands back on the terminal, showing the
actual ALTER TABLE ... LOOKUP (...) command text in the session log.
DDecoene added 5 commits July 12, 2026 17:09
docs: demo GIF now shows a LOOKUP column dropdown
doAtSayGet's variable-fallback branch (introduced by #59's field-
binding rewrite) hardcoded value: '' instead of reading
this.vars.get(varName), so every GET on a variable that already held
a value (a STORE'd default, or a resubmitted form) showed blank.

Silently broke every demo that pre-fills a form default: overtime.prg
(m_week defaults to today's date in two menus, m_date in Register
Leave Taken), INVENTORY.prg (m_stock/m_reord/m_price/m_qty default to
0/0.00 in three menus), crm.prg (m_val defaults to 0.00 in Add Deal).

No test caught it because every existing var-GET test used a variable
with no prior value, where '' is the correct answer either way — the
untested surface was re-display of an existing value, not first
display of a blank one.
fix: memory-variable GET prefills from its stored value again
@DDecoene DDecoene merged commit e2030fc into main Jul 13, 2026
4 checks passed
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