Static ReadonlyEXPLICIT_Sentinel stored in localStorage when the user explicitly picks the
"Default form" option from the variant picker. Distinct from a
missing localStorage key (= "no preference, use auto-pick rules")
and from an override UUID. Without this sentinel, picking "Default"
cleared the preference and pickActive re-applied the auto-pick —
which always selects the first Active override, making the
CodeGen/Angular fallback unreachable from the UI.
Format: a leading __ makes it visually distinct from a UUID and
impossible to collide with one (UUIDs don't contain underscores).
Wipe the user's stored preference for this entity. Next load applies the auto-pick rules (first Active override in tier order). Called internally when a saved override ID is no longer valid. Fire-and-forget — the resolver doesn't need to await the delete.
Read the user's previously-saved variant choice for the entity.
Synchronous because UserInfoEngine keeps the user-settings table
in memory after bootstrap. Returns the stored UUID, the explicit-
default sentinel, or null when no preference exists.
Public list-API for the variant switcher UI. Returns all variants applicable to (entity, user). Includes Active, Pending, and Inactive rows so the picker can offer "switch back to v1.0.0" alongside the current active variant.
Record that the user explicitly picked the "Default form" row in
the picker. pickActive reads this sentinel and returns null even
when Active overrides exist for the entity, so the form-loading
path falls back to CodeGen's @RegisterClass lookup.
Persist a specific override choice. Pass the override UUID. Writes
via UserInfoEngine.SetSettingDebounced so rapid successive picks
don't hammer the DB. Use SetExplicitDefault to record "user
wants the CodeGen Angular fallback" and ClearSelectedVariant
to wipe the preference entirely (revert to auto-pick).
Picks the form to render for an entity record and exposes the full list of applicable variants so the toolbar's variant switcher can offer alternates.
Tier order for the default pick:
EntityFormOverriderow matching the caller's User/Role/Global scope, Status='Active', ordered by scope tier (User > Role > Global), then Priority DESC, then__mj_CreatedAt DESC. First row wins.ClassFactory.GetRegistration(BaseFormComponent, entityName)— theRegister Class
Session selection. If the user previously chose a non-default variant via the variant switcher and that choice is still applicable + Active, that choice wins over the default. Choice is keyed by entity name in
localStorage. Honoring this is part of the variant-switcher contract; without it, switching variants would only last for the lifetime of the record-form view.Performance. Backed by
InteractiveFormsEngine(in MJCoreEntities) — overrides are cached in memory with BaseEntity event-driven invalidation, so resolution is an O(N) JS filter against a small set instead of a per-LoadForm RunView round-trip. Cold latency dropped from ~50ms to <1ms after the first load. The engine is lazy-Config'd here on first resolution; users who never open a record pay nothing.