Skip to content

CREATE SCREEN / MODIFY SCREEN — visual form designer emitting editable W3Script #73

Description

@DDecoene

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

  • CREATE SCREEN <name> / MODIFY SCREEN <name> commands.
  • Visual designer on the character-cell grid (reuse FormLayout.ts's coordinate model): place a SAY label, place a GET bound to a column of the active table, drag to reposition.
  • Emits real W3Script@ r,c SAY "…" GET <field> source, not an opaque blob. The generated source must open in the program editor and be editable by hand.
  • Round-trips. MODIFY SCREEN reopens generated source back into the designer, the way MODIFY STRUCTURE already round-trips a schema. Hand edits that stay within the grammar must survive.
  • LIST SCREENS, DELETE SCREEN <name>.
  • Storage server-side in data/system.sqlite3 — follow ProgramStore.ts / ReportStore.ts for the shape (a ScreenStore.ts).
  • Assistant parity: a Screens category + designer entry point (DoD requires it).
  • Playwright e2e: design a screen, save, DO a program that runs it, assert the record was written.

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions