Rules: form design
Form design rules
-
These design rules do NOT cover the
DESIGNlayout model — the default container tree, the flexboxfill/ alignment model, or the container idioms. They give only placement meta-advice. Before writing or modifying anyDESIGN, the assistant MUST retrieve theForm_designdocumentation; it MUST NOT rely on these rules as if they described the layout model.The complete tables of the properties of components of every kind (containers, components of properties and actions on the form, toolbars, grids) live in the
DESIGNstatement documentation (DESIGN_statement). When setting a component property, the assistant MUST check its name and allowed values against those tables, and MUST NOT guess them by analogy. -
The assistant SHOULD specify a
DESIGNfor all interactive forms containing more than four properties. -
Exception: for a trivial form with only one or two objects in
GRIDmode and no other properties displayed inPANELmode, omittingDESIGNis acceptable. -
In
DESIGN, the assistant SHOULD prefer movingBOX(...)containers for tables first.GRID(...)SHOULD be used only when absolutely necessary. -
If possible, the assistant SHOULD avoid form designs with more than two tables stacked vertically and more than two tables placed horizontally.
-
Custom actions added to a grid form (status changes, document generation, bulk operations) MUST be given an explicit
TOOLBARview, e.g.PROPERTIES(o) confirmDoc TOOLBAR. Actions default to thePANELview, so withoutTOOLBARthe custom button is drawn as a separate group below the table instead of in the grid toolbar next to the predefinedNEW/EDIT/DELETE, to which the platform gives that sameTOOLBARview — so they share theTOOLBARcontainer with it, not theTOOLBARSYSTEMone, which is where aMOVEorREMOVEof the wrong container goes astray. The property / action views areGRID,TOOLBAR,PANEL, andPOPUP. -
A
TEXT-typed property displayed as a grid column is rendered as a multi-line row four lines tall by default, degrading list density. Such columns commonly result from the standard string properties (lpad[TEXT, INTEGER, TEXT],substr[TEXT, INTEGER, INTEGER],trim[TEXT]and the rest): they, as a rule, returnTEXTregardless of the argument classes, and concatenating aTEXToperand with a bounded string keepsTEXTas well. On list forms, the assistant SHOULD instead expose the value cast toSTRING[n]. The cast entry follows the expression-entry rules: in aPROPERTIESblock without a common-parameter header, with an explicit alias (shortNote = STRING[100](note(o))). A bare cast without an alias, like any expression inside a common-parameter header blockPROPERTIES(o), is a parse error — there, declare a named property with the cast and add it by its ID. -
To display data, the assistant MUST first consider the standard object group view types: the table, the pivot table with its charts (
PIVOT), the calendar (CALENDAR), the map (MAP). A custom view on a React component — aDESIGNcontainer with thecustomattribute; web client only, the desktop client renders the container's regular subtree — is used when something beyond a simple table, a simple calendar, a simple chart, or a pivot table is needed: a kanban board, a timetable, a card feed, a seating chart, drag-and-drop the standard views do not provide, a nonstandard layout or interactivity. Before creating such a view, the assistant MUST retrieve theHow-to_Custom_React_viewsdocumentation. -
FALSEis valid in the logical attributes of aDESIGNblock —defaultComponent,activatedand the like — because their values are literals, not expressions. The core rule that bansFALSEcovers expressions only, and MUST NOT be applied here by rewriting it asNULL.