Managing Fields
Editing and retiring definitions, the change-history dialog, the usage and impact report, deleting without destroying data, the 18-column spreadsheet export, and the two read-only reference screens.
Once fields exist, the Custom Fields screen is where they are looked after: edited, retired, audited, measured and exported. This page covers each of those, and the two read-only reference screens that answer "what types exist" and "what record types can I attach to".
The row menu
Every field in the list has a row menu with eight actions. Each needs its own permission, so a role may see some and not others.
| Action | What it does | Permission |
|---|---|---|
| Edit | Opens the definition form, populated from the field's full detail. | custom-fields.update |
| Option sets | Attaches, configures or detaches a shared versioned option set for Select or MultiSelect fields. | custom-field-option-sets.view |
| Visibility rules | Opens the conditional visibility rule dialog to configure show-or-hide rules evaluated against sibling fields. | custom-field-visibility-rules.view |
| Convert value type | Opens a dialog to convert the field's value type: pick a target from the types it can safely become, confirm if the conversion is lossy, and roll back afterwards if needed. | custom-fields.update |
| Version history & drafts | Opens the version history drawer: read the chain of versions, mint a new draft, or publish or discard one already minted. | custom-fields.view |
| History | Lists every recorded change to the field's definition, newest first, with who and when. | custom-fields.view |
| Usage & impact | Reports how many answers the field holds, broken down by record type, and whether deleting it would destroy data. | custom-fields.view |
| Delete | Deletes the definition — refused first if it holds answers, until you confirm explicitly. | custom-fields.delete |
Editing a definition
Editing opens the same form as creating, with the permanent settings shown but not editable: record type, key, value type and scope. Everything else can be changed, and the changes take effect on the next form somebody opens.
If the detail behind the Edit button fails to load, the form deliberately does not open, and you get a message instead. That is a safeguard rather than an inconvenience: the list row does not carry the options, the placeholders or the validator, so opening a form populated from it and saving would silently erase all three.
Visibility rules administration
Visibility rules allow fields to be shown or hidden dynamically on record forms based on the values of sibling custom fields on the same record type. When a rule is active, client-side forms and server-side validation evaluate the conditions deterministically.
| Operator | Condition evaluated | Example trigger |
|---|---|---|
| Equals | The controlling field's value exactly matches the target value. | Show Kit Size when Staff Role equals Coach. |
| Does not equal | The controlling field has any value other than the target value. | Show Dietary Requirements when Meal Plan does not equal None. |
| Is empty | The controlling field holds no stored answer or null. | Show Explanation when ID Number is empty. |
| Is not empty | The controlling field has any non-null, non-empty value. | Show Expiry Date when Passport Number is not empty. |
| In set | The controlling field's answer is one of multiple comma-separated values. | Show Specialization when Department in Medical, Coaching, Analytics. |
| Not in set | The controlling field's answer is none of the listed values. | Show General Notes when Category not in VIP, Board. |
| Greater than | The numeric or date answer strictly exceeds the threshold. | Show Clearance Details when Security Level greater than 3. |
| Less than | The numeric or date answer is strictly below the threshold. | Show Parental Consent when Age less than 18. |
A field with several rules is visible only when every one of them is satisfied — a plain AND across all of them, not a contest between competing Show and Hide actions, because a rule only ever expresses one condition to be visible under. Priority orders the rules for diagnostics and display only; it never changes which rules apply. A field a rule is currently hiding is skipped by Required validation too, so a condition nobody can see never blocks a save.
Value-type conversion and rollback
Converting a field's declared value type is a separate operation, reached from its own row-menu action rather than the edit form — it changes how already-stored answers are represented, not just what future ones look like. Only nine specific type pairs are allowed; every other pair is refused outright, including any pair touching a reference type, File, Image or RichText.
| Safety class | Supported type pairs | Data preservation guarantee |
|---|---|---|
| Lossless | Text → LongText, Number → Text, Number → LongText, Percent → Text, Rating → Text, Percent → Number, Rating → Number | Every existing value parses directly into the target type with nothing lost — a number formatted as text, or a percentage or rating re-read as a plain number. |
| Lossy (requires confirmation) | LongText → Text, Text → Number | Neither pair truncates. LongText → Text refuses the whole operation the moment one stored value is over Text's own 4,000-character cap, naming its actual length. Text → Number refuses the whole operation the moment one stored value fails to parse as a number. Either way, a single bad row blocks every row — there is no partial conversion that changes some records and leaves others as they were. |
| Not offered | Every other pair — 453 of the 462 possible, including any pair touching EntityReference, UserReference, File, Image or RichText. | Refused before anything runs. A reference-shaped or media-shaped value has no meaningful text or number form to convert into, and the reverse direction has nothing real to point at. |
Before changing anything, the server checks every stored value against the target type in a first pass that writes nothing. If even one value would fail to convert, the whole operation is refused up front, naming every failing row, and nothing is changed — it is all-or-nothing, never a partial conversion that leaves some rows old and some new.
Field definition versions and drafts lifecycle
A definition's live scalars, options and visibility rules can be cloned into an isolated draft, then either published — replacing the live version in one step — or discarded, leaving the live version untouched either way.
| Status | Lifecycle meaning | Available actions |
|---|---|---|
| Draft | An isolated clone of the definition as it stood at the moment it was minted — its own copy of the scalars, options and visibility rules. Not served on any record form. | Publish, Discard. Nothing currently edits a draft after it is minted — a wrong clone has to be discarded and re-minted. |
| Published | The one active version currently served on every record form for this field. | Create Draft (mints a new working clone), View History. |
| Deprecated | A former Published version, replaced when a draft was promoted. Its cloned options and rules stay attached to it but are inert — enforcement only ever reads the current Published version. | Read-only audit record. Retained for historical integrity. |
| Archived | A discarded draft, kept rather than deleted so its version number can never be reissued. | Historical reference only. |
Publishing a draft deprecates the incumbent Published version in the same save. The version number always increments, and every form load from that point serves the new Published version.
Retiring a field: deactivate or delete
These are not the same operation and the difference matters. If you are unsure, deactivate — it is the reversible one.
Turning Active off
- The field stops being offered on create and edit forms
- Every answer already stored is kept, untouched
- It is reversible — turning Active back on restores the field as it was
- It is recorded in history as Deactivated, and can be Reactivated later
Deleting the definition
- Refused on the first attempt if the field holds any answers
- Destroys those answers once the retention window passes, if you confirm
- Frees the key, so a new field could later reuse it — with none of the old answers
- Is recorded in history as Deleted, and may be Restored while it is recoverable
Definition history
The History entry in a field's row menu opens a dialog listing what has happened to that field's definition, newest first, with the person who did it and when. A change made by the system rather than a person is attributed to the system. Entries are paged, and the dialog says how many changes there are in total.
| Event | What it means |
|---|---|
| Created | The field was defined. |
| Updated | Something on the definition changed — a label, a flag, the validator, the options. |
| Deactivated | Active was turned off, retiring the field without touching its answers. |
| Reactivated | Active was turned back on. |
| Deleted | The definition was deleted and is still recoverable. |
| Restored | A deleted definition was brought back. |
| Purged | The definition was permanently removed and is no longer recoverable. The dialog marks this one explicitly so it cannot be read as an ordinary delete. |
Each entry also says which part of the field it concerns, because a field is more than a single row.
| Part | What it means |
|---|---|
| Field | The field itself. |
| Definition | The definition record behind it. |
| Version | A version of the definition. |
| Option | One entry in the field's options list. |
| Visibility rule | A conditional show-or-hide rule attached to the field, managed via the Visibility Rules dialog. |
Usage and impact
The Usage & impact entry in the row menu reports what the field is actually carrying before you change or remove it. Read the whole dialog rather than one number.
| What it shows | What it means |
|---|---|
| Stored values | How many answers exist for this field. |
| Values in the legacy store | Answers still held in the older storage from before the current value store. Counted separately so a migration in progress is visible rather than hidden. |
| Options | How many options the field's list holds, for a Select or MultiSelect field. |
| By record type | The same answer count split by the kind of record holding it, so you can see where the data actually is. |
| Organisations holding values | For a global platform field, how many workspaces hold answers for it. This is the number that makes a delete genuinely consequential. |
| The scope notice at the top | Says whether the counts below cover your workspace only or every workspace on the platform. The two differ by orders of magnitude for an inherited field, and nothing about a bare number tells you which one you are looking at. |
Deleting without destroying data
Deleting a field that holds answers takes two deliberate steps. A field with no answers takes one.
Open Usage & impact first
See how many answers exist and where they are. If the number surprises you, stop here — deactivating the field is almost always the better move.Choose Delete
If the field holds answers, the delete is refused with a conflict and the dialog explains exactly what would be lost, naming the number of stored values and the number of record types.Confirm the destructive delete
Confirming from inside that dialog is what actually proceeds. This is a separate, explicit act rather than a second click on the same button, so a field with data cannot be removed by momentum.Or delete an empty field in one step
A field with no answers deletes with no warning and no extra step, because there is nothing to lose.
A confirmed delete destroys the stored answers once the retention window passes, not instantly. Until then the definition may still be Restored, and history records both the delete and the restore. After the window, the answers are gone and the history entry reads as Purged.
Exporting definitions to a spreadsheet
The Export action in the Custom Fields page header downloads a spreadsheet of the definitions you can see, one row per field with headers on the first row. These are the 18 columns.
| Column | Contains |
|---|---|
| Entity type | The record type the field is defined against. |
| Key | The field's machine key. |
| Label (EN) | The English label. |
| Label (AR) | The Arabic label, blank if none was set. |
| Value type | One of the twenty-two value types. |
| Required | Whether the field is required. |
| Active | Whether the field is still offered on forms. |
| Sort order | The field's position among the record type's custom fields. |
| Options (EN) | The English options, for a Select or MultiSelect field. |
| Options (AR) | The Arabic options, aligned with the English ones. |
| Sensitivity | The classification label set on the definition. |
| Included in exports | The Include in exports setting, reported as Yes or No. It is never used to filter this file — a definitions export that dropped rows would hide exactly the fields an administrator most needs to audit. |
| Validator | The attached validator, for a Text field. |
| Validator parameter | The validator's setting, where it takes one. |
| Placeholder (EN) | The English placeholder hint. |
| Placeholder (AR) | The Arabic placeholder hint. |
| Scope | Platform for a global field, Organisation for a workspace one. |
| Created (UTC) | When the definition was created, in UTC. |
Yes/no columns are written as the words Yes and No rather than as spreadsheet booleans, so they survive being opened in a different language and still read as intended.
The two reference screens
Both are reached from links in the Custom Fields page header, both are read-only, and both are gated behind the same view permission as the Custom Fields screen itself. Neither has a sidebar entry of its own, which is deliberate.
Value Types
A table of all twenty-two value types with, for each, a description of what it is for, whether it takes a placeholder, whether it owns an options list, and whether it supports a validator. Use it to answer "what types exist" without opening a definition form. Text is the only row showing validator support, and the four reference-shaped types (EntityReference, UserReference, File, Image) show no options list of their own — what they point at comes from another module or an upload rather than from a list you author.
Entity Types
A list of every record type a custom field can be attached to: its display name, its key, and the module that owns it.
It also shows two separate screen columns plus a status, which is not a duplication. One is what the platform claims about this application; the other is what this application actually has. The status column says whether the two agree, and a row reading Out of Sync is a real defect worth reporting — it means either a field pointed at a record type nobody can render, or a screen the platform does not know exists.