Release v1.3.0 — LOOKUP columns#71
Merged
Merged
Conversation
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)
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)
… form-error on rejection
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)
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.
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
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
LOOKUPcolumn qualifier (language grammar + storage), REPLACE/BROWSE enforcement with dropdown editing, field-bound@ SAY GETwith all-or-nothing form validation, demo adoption (overtime SCHEDULES table, CRM deal stage list), and Assistant wizard support for declaring lookups.[Unreleased] — v1.3.0 in progress→[1.3.0] — 2026-07-13.Test plan
npm test— 447/447 passingnpx playwright test— 96/96 passing