The centrepiece of v1.4.0. See docs/roadmap-v1.4-v1.5.md for the why.
Why
The single most-requested capability across both community threads. WebBase-III has a report designer (CREATE REPORT, ReportWizard) and an editable grid (BROWSE) — but no form designer. A form exists only if you hand-write @ SAY GET into a .prg.
"One of the very cool things Fox allow us was to ship their ability to CREATE FORM, CREATE REPORT, BROWSE, etc so the users can customize the app with the same power as us. This is one of the most important advantages of ERPs and such made with Fox and is still unmatched."
— mamcx, HN
"Loved doing xbase coding back in the day as it had everything all in one tool. Especially when you added in SQL, form and report builders."
— garyk1968, r/retrocomputing
dBASE III+ had a screen painter. FoxPro had CREATE FORM. WebBase-III has neither, and it is the one component standing between this project and a demonstration of its own thesis.
Scope
Notes
Binding is already solved — don't reinvent it. Field-bound @ SAY GET shipped in v1.3.0 (#59): a GET naming a table column binds to the record, prefills from it, validates on submit (declared type + LOOKUP membership), and renders a picker for lookup columns. The designer's job is to place fields, not to bind them.
The centrepiece of v1.4.0. See
docs/roadmap-v1.4-v1.5.mdfor the why.Why
The single most-requested capability across both community threads. WebBase-III has a report designer (
CREATE REPORT, ReportWizard) and an editable grid (BROWSE) — but no form designer. A form exists only if you hand-write@ SAY GETinto a.prg.dBASE III+ had a screen painter. FoxPro had
CREATE FORM. WebBase-III has neither, and it is the one component standing between this project and a demonstration of its own thesis.Scope
CREATE SCREEN <name>/MODIFY SCREEN <name>commands.FormLayout.ts's coordinate model): place aSAYlabel, place aGETbound to a column of the active table, drag to reposition.@ r,c SAY "…" GET <field>source, not an opaque blob. The generated source must open in the program editor and be editable by hand.MODIFY SCREENreopens generated source back into the designer, the wayMODIFY STRUCTUREalready round-trips a schema. Hand edits that stay within the grammar must survive.LIST SCREENS,DELETE SCREEN <name>.data/system.sqlite3— followProgramStore.ts/ReportStore.tsfor the shape (aScreenStore.ts).DOa program that runs it, assert the record was written.Notes
Binding is already solved — don't reinvent it. Field-bound
@ SAY GETshipped in v1.3.0 (#59): aGETnaming a table column binds to the record, prefills from it, validates on submit (declared type +LOOKUPmembership), and renders a picker for lookup columns. The designer's job is to place fields, not to bind them.