Whether the current user may publish to a role or to everyone.
Only decides what the drawer draws. The server-side entity subclasses enforce the same rule on every save, so a client that draws itself a Publish button still has the write refused.
Optionalprovider: IMetadataProvider | nullWhether the entity carries any contribution row at all, whatever its status.
Separate from RowsForEntity because the container asks this on every change-detection pass to decide whether to offer the manager, and projecting every row to answer a yes-or-no question allocates on the hottest path in the form runtime.
Hides a panel from this user's form. Stored per user; nobody else is affected.
The full custom forms the engine holds for this entity, in every status: every shared form and the signed-in user's own.
Changes who a panel is for, and turns it on.
The panel live for that audience under the same key is retired first, in the same transaction, so the audience never sees two and the unique index on active contributions never sees two either. A draft or a panel that is off goes live in the same transaction — publishing one never leaves the audience with neither.
Optionalprovider: IMetadataProvider | nullChanges who a full custom form is for, and makes it live. Whichever form was live for that audience is set aside in the same transaction. A personal form set aside stays in its owner's picker, so the two can be swapped back; a role or everyone form set aside is retracted and no longer offered to anyone.
Optionalprovider: IMetadataProvider | nullDeletes a row outright. The Component it points at is left alone.
Optionalprovider: IMetadataProvider | nullWhich panels on this form draw for the current user: the winner of each key, with the user's hidden panels left out — the same resolution the form makes. Undefined when that cannot be resolved, so the list falls back to each item's own status.
Optionalprovider: IMetadataProvider | nullEvery contribution registered on this entity, whatever its scope or status.
Not GetApplicableContributions: that answers what should render right now, which
excludes the drafts and switched-off rows this surface exists to bring back.
Switches a row on or off. Off leaves the row in place, rendering for nobody. On retires the panel live under the same key for the same audience first, in the same transaction.
Optionalprovider: IMetadataProvider | nullWrites a new placement onto an existing row, through the same row mapper the Create and Modify actions use.
Every claim column is rewritten, including the ones the decision leaves out, so a claim the user has just dropped is actually cleared. The key is the one the decision names, or the one the write path derives from its grid claim or the row's component. The order, rail inclusion and configuration, which the placement dialog does not edit, are kept.
What the row is saved as: on, a draft, or off. On retires the panel live under the row's new key for its audience, in the same transaction.
Optionalprovider: IMetadataProvider | nullBrings a hidden panel back.
Loads and changes the contribution rows behind one entity's form.
Reads come from InteractiveFormsEngine, which already caches every row for every scope and status and emits when one changes — the same cache the form runtime reads, so the manager cannot disagree with the form it is managing.
Writes go through
BaseEntity.Save()and.Delete(). Direct SQL against an entity skips the Record Changes audit row, the server cache invalidation, entity actions and validation, all of which fail silently and leave a database that looks right.Turning a form or panel on follows the rule the Activate actions follow: the one live under the same key for the same audience is retired first, in the same transaction, and each component's status mirrors its row's.